急急急:关于二叉树的算法 遍历 左右子树交换 用类C语言 要详细代码

(1)编写建立二叉树的算法。
(2)验证二叉树的先序、中序、后序、层次遍历算法
(3)编写二叉树的左右子树交换算法
楼下的大虾 能不能麻烦你把层次遍历写下啊 写了给你加100分啊

(1)编写建立二叉树的算法。
(2)验证二叉树的先序、中序、后序遍历算法
(3)编写二叉树的左右子树交换算法
上面这些都比较简单,程序如下:

#include <stdio.h>
#include <malloc.h>

typedef struct tree
{
char data;
struct tree *l;/*左儿子*/
struct tree *r;/*右儿子*/
}tr;

/*先序建立二叉树*/
tr *create(tr *t)
{
tr *k=NULL;
char ch;

scanf("%s",&ch);
if(ch=='#')
{
t=NULL;
}
else
{
t=(tr *)malloc(sizeof(tr));
t->data=ch;
t->l=create(k);
t->r=create(k);
}
return t;
}

/*先序遍历*/
void preOrder(tr *t)
{
if(t)
{
printf("%c\t",t->data);
preOrder(t->l);
preOrder(t->r);
}
}

/*中序遍历*/
void inOrder(tr *t)
{
if(t)
{
inOrder(t->l);
printf("%c\t",t->data);
inOrder(t->r);
}
}

/*后序遍历*/
void postOrder(tr *t)
{
if(t)
{
postOrder(t->l);
postOrder(t->r);
printf("%c\t",t->data);
}
}

/*左右子树交换*/
void switchChild(tr *t)
{
if(t)
{
tr *temp;

temp=t->l;
t->l=t->r;
t->r=temp;
switchChild(t->l);
switchChild(t->r);
}
}

main()
{
tr *head=NULL;

head=create(head);
printf("\n The preOrder is:");
preOrder(head);
printf("\n The inOrder is:");
inOrder(head);
printf("\n The postOrder is:");
postOrder(head);
printf("\n");
switchChild(head);
}

层次遍历也不难,但需要用到堆栈。
如果自己写堆栈的操作,也不难,但比较麻烦了。

补充:
已经写的代码,是完全符合的啊。
层次遍历,要用到堆栈,嫌麻烦就没有写了!
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-06-10
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
char data;
struct Node * Lchild;
struct Node * Rchild;
}BitNode,*Bitree;

void CreateBitree(Bitree *bt)
{
char ch;
ch = getchar();
if(ch == '.')
*bt=NULL;
else
{
*bt = (Bitree)malloc(sizeof(BitNode));
(*bt)->data = ch;
CreateBitree(&((*bt)->Lchild));
CreateBitree(&((*bt)->Rchild));
}
}
void Visit(char ch)
{
printf("%c ",ch);
}

void PreOrder(Bitree root)
{
if(root != NULL)
{
Visit(root->data);
PreOrder(root->Lchild);
PreOrder(root->Rchild);
}
}
void InOrder(Bitree root)
{
if(root != NULL)
{
InOrder(root->Lchild);
Visit(root->data);
InOrder(root->Rchild);
}
}

void PostOrder(Bitree root)
{
if(root != NULL)
{
PostOrder(root->Lchild);
PostOrder(root->Rchild);
Visit(root->data);
}
}

void PrintTree(Bitree bt , int n)
{
int i ;
if(bt == NULL)
return ;
printf("\n");
for(i = 0 ; i < n ; i ++)
printf(" ");
Visit(bt->data);
PrintTree(bt->Lchild,n+1);
PrintTree(bt->Rchild,n+1);
}
void InOrder2(Bitree root)
{
int top;
Bitree p;
Bitree s[20];
top = 0;
p = root;
do{
while(p != NULL)
{
if(top>19)
return;
top = top + 1;
s[top] = p;
p = p->Lchild;
}
if(top != 0)
{
p = s[top];
top = top -1;
Visit(p->data);
p = p->Rchild;
}
}while(p != NULL || top != 0);
}

int main(int argc, char *argv[])
{
BitNode *root;
CreateBitree(&root);
printf("按树状结构输出二叉树:\n");
PrintTree(root,0);
printf("\n");
printf("先序遍历输出:\n");
PreOrder(root);
printf("\n");
printf("中序遍历输出: \n");
InOrder(root);
printf("\n");
printf("后序遍历输出: \n");
PostOrder(root);
printf("\n");
printf("非递归中序输出:\n");
InOrder2(root);
system("PAUSE");
return 0;
}

//这是以前有写过的代码,因为很久没接触了,也不知道是不是能调试成功,希望对朋友你有点用。

交换二叉树的所有节点的左右子树算法(C语言)
二叉树最好使用递归的算法,假设二叉树节点定义如下:typedef struct node{ int a;node* left;node* right;};可以定义交换左右子树的函数如下:void changeleaf(node* anode){ if(anode!=0){ node* tnode=anode->left;anode->left=anode->right;anode->right=tnode;changeleaf(anode->left);cha...

c语言二叉树问题,勿写代码,求详细思考过程
从后序遍历:CDABE得出E是最顶根节点。然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。再分析后序遍历CDA可以知道A是CD的根,而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)最后,先序遍历:若树不空,则先访问根结点,然后依次先根遍历各棵子树。于是得到结束: ...

二叉树先序非递归遍历C语言算法
printf("先序非递归建立一个二叉树:"); if((ht=createprebitree())!=NULL) \/\/非递归建立 \/\/CreateBiTree(&ht); \/\/if(ht!=NULL) \/\/递归建立 { printf("先序遍历输出二叉树:"); preordertraverse(ht); putchar('\\n'); printf("中序遍历输出二叉树:"); inordertraverse(ht); putchar('\\n')...

二叉树前序遍历法举例!急急急!!!
1.前序遍历法:前序遍历(DLR)前序遍历(DLR)前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。若二叉树为空则结束返回,否则:(1)访问根结点 (2)前序遍历左子树 (3)前序遍历右子树 注意的是:遍历左右子树...

求二叉树高度的原理、算法是什么,越详细越好,C语言,谢谢
首先分析二叉树的深度(高度)和它的左、右子树深度之间的关系。从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。int Depth (BiTree T ){ \/\/ 返回二叉树的...

二叉树遍历的算法实现
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:⑴访问结点本身(N),⑵遍历该结点的左子树(L),⑶遍历该结点的右子树(R)。以上三种操作有六种执行次序:NLR、LNR、LRN、NRL、RNL、RLN。注意:前三种...

4. 设二叉树的存储结构为二叉链表,试写出算法(C函数):将所有结点的左右...
按前序遍历此二叉树的结果为: Hello!How are you?proc preorder(bt:bitreprtr)if (bt<>null)[print(bt^);preorder(bt^.lchild);preorder(bt^.rchild);]end;5.3.2 中序遍历 中序遍历运算:即先中前序遍历左子树,然后再访问根结点,最后再中序遍历右子树。中序遍历运算访问二叉树各结点...

数据结构中关于用c++语言建立二叉树的问题,求代码,急!!!
CreateBiTree(&((*bt)->RChild)); \/\/生成右子树 } } 程序如下:(1)include "bitree.h"void preOrder(BiTree root)\/*先序遍历二叉树, root为指向二叉树根结点的指针*\/ { if (root!=NULL){ printf("%c",root->data); \/*输出结点*\/ preOrder(root ->LChild);\/*先序遍历左...

关于二叉树的递归遍历还是不理解 那位高手能不能详细讲一下!!!_百度...
例如:先序遍历 1、首先访问根节点A,然后接下来要去访问它的左子树 2、将它的左子树当成一棵完整的二叉树:B \/ \\ D E 这个你要采用先序来进行遍历的话,还是先遍历根节点,然后左子树,然后右子树。那么这个时候必定要先访问根节点B了。3、再将B的左子树当成一棵新的二叉树:D 由于其没有...

二叉树先序遍历算法流程图怎么画,学的是数据结构c语言。
首先要搞明白二叉树的几种遍历方法:(1)、先序遍历法:根左右;(2)、中序遍历法:左根右;(3)、后序遍历法:左右根。其中根:表示根节点;左:表示左子树;右:表示右子树。至于谈到如何画先序遍历的流程图,可以这样考虑:按照递归的算法进行遍历一棵二叉树。程序首先访问根节点,如果根节点...

相似回答