C语言二叉树的遍历。

如题所述

二叉树的前中后遍历(递归与非递归)
#include<stdio.h>
#include<stdlib.h>

typedef struct NODE
{
char value;
struct NODE *LChild;
struct NODE *RChild;
}BiTNode,*BiTree; //二叉树数据结构
BiTree root;
typedef struct node
{
BiTNode *pointer;
struct node *link;
}LinkStackNode,*LinkStack; //链栈数据结构
LinkStack S;
int count = 0;
//BiTNode * InitTree(BiTree Tree);
BiTNode *CreateTree(BiTree Tree); //创建二叉树
void PreOrder(BiTree Tree); //递归前序遍历二叉树
void MidOrder(BiTree Tree); //递归中序遍历二叉树
void PostOrder(BiTree Tree); //递归后序遍历二叉树
void NPreOrder(BiTree Tree); //非递归前序遍历二叉树
void NMidOrder(BiTree Tree); //非递归中序遍历二叉树
void NPostOrder(BiTree Tree); //非递归后序遍历二叉树
//---------------------------------------------------
LinkStackNode *InitLinkStack(LinkStack top); //初始化链栈
void Push(LinkStack top,BiTNode *p); //进栈操作
BiTNode * Pop(LinkStack top); //出栈操作
//int IsEmpty(LinkStack S); //判断栈是否为空
void main()
{
//BiTree tree;
//root = InitTree(tree);
root = CreateTree(root);
PreOrder(root);
printf("\n");
MidOrder(root);
printf("\n");
PostOrder(root);
printf("\n");
NPreOrder(root);
printf("\n");
NMidOrder(root);
printf("\n");
NPostOrder(root);
printf("\n");
}

/*BiTNode * InitTree(BiTree Tree)
{
//BiTNode *root;
//root = Tree;
Tree = (BiTNode *)malloc(sizeof(BiTNode));
Tree = NULL;
//Tree->LChild = NULL;
//Tree->RChild = NULL;
return Tree;
}*/

//二叉树的扩展先序遍历的创建
BiTNode * CreateTree(BiTree Tree)
{
char ch;
ch = getchar();
if(ch == '.')
Tree = NULL;
else
{
Tree = (BiTNode *)malloc(sizeof(BiTNode));
if(Tree)
{
Tree->value = ch;
Tree->LChild = CreateTree(Tree->LChild);
Tree->RChild = CreateTree(Tree->RChild);
}
}
return Tree;
}

//递归前序遍历二叉树
void PreOrder(BiTree Tree)
{
if(Tree)
{
printf("%c",Tree->value);
PreOrder(Tree->LChild);
PreOrder(Tree->RChild);
}
}

//递归中序遍历二叉树
void MidOrder(BiTree Tree)
{
if(Tree)
{
MidOrder(Tree->LChild);
printf("%c",Tree->value);
MidOrder(Tree->RChild);
}
}

//递归后序遍历二叉树
void PostOrder(BiTree Tree)
{
if(Tree)
{
PostOrder(Tree->LChild);
PostOrder(Tree->RChild);
printf("%c",Tree->value);
}
}

//非递归前序遍历二叉树
void NPreOrder(BiTree Tree)
{
BiTNode *p;
S = InitLinkStack(S);
p = Tree;
while(p || count != 0)
{
if(p)
{
if(p->RChild)
Push(S,p->RChild);
printf("%c",p->value);
p = p->LChild;
}
else
p = Pop(S);
}
}

//非递归中序遍历二叉树
void NMidOrder(BiTree Tree)
{
//char ch;
BiTNode *p;
S = InitLinkStack(S);
p = Tree;
while(p || count != 0)
{
if(p)
{
Push(S,p);
p = p->LChild;
}
else
{
p = Pop(S);
printf("%c",p->value);
p = p->RChild;
}
}
}

//非递归后序遍历二叉树
void NPostOrder(BiTree Tree)
{
BiTNode *p,*q = NULL;
S = InitLinkStack(S);
p = Tree;
while(p || count != 0)
{
if(p)
{
Push(S,p);
p = p->LChild;
}
else
{
p = S->link->pointer;
if(p->RChild == NULL || p->RChild == q)
{
p = Pop(S);
printf("%c",p->value);
q = p;
p = NULL;
}
else
{
//p = Pop(S);
p = p->RChild;
}
}
}
}
//初始化链栈
LinkStackNode *InitLinkStack(LinkStack top)
{
top = (LinkStackNode *)malloc(sizeof(LinkStackNode));
return top;
}

//进栈操作
void Push(LinkStack top,BiTNode *p)
{
LinkStackNode *temp;
temp = (LinkStackNode *)malloc(sizeof(LinkStackNode));
if(temp)
{
temp->pointer = p;
temp->link = top->link;
top->link = temp;
count++;
}
}

//出栈操作
BiTNode * Pop(LinkStack top)
{
//char ch;
BiTNode *p;
LinkStackNode *temp;
p = (BiTNode *)malloc(sizeof(BiTNode));
temp = top->link;
if(temp)
{
top->link = temp->link;
p = temp->pointer;
free(temp);
count--;
}
return p;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-23
简单啊 都给你,书上有原版的,链式存储的哦

typedef int TElemType;//定义
typedef struct BitNode
{ TElemType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

void PreOrderTraverse(BitTree bt)//先序遍历
{ if(bt!=NULL)
{printf("%d",bt->data);
PreOrderTraverse(bt->lchild);
PreOrderTraverse(bt->rchild);
}

void InOrderTraverse(BitTree bt)//中序遍历
{ if(bt!=NULL)
{ InOrderTraverse(bt->lchild);
printf("%d",bt->data);
InOrderTraverse(bt->rchild);
}

void PostOrderTraverse(BitTree bt)//后序遍历
{ if(bt!=NULL)
{ PostOrderTraverse(bt->lchild);
PostOrderTraverse(bt->rchild);
printf("%d",bt->data);
}本回答被网友采纳
第2个回答  2011-03-23
三种啊。千序遍历DLR:先根结点,再左子树,后右子树
中序遍历LDR:先左子树,再根结点。后右子树
后序遍历LRD:先左子树,再右子树,后根结点
第3个回答  2011-03-23
我有霍夫曼树的遍历,你要不?

二叉树先序非递归遍历C语言算法
printf("先序遍历输出二叉树:"); preordertraverse(ht); putchar('\\n'); printf("中序遍历输出二叉树:"); inordertraverse(ht); putchar('\\n'); printf("后序遍历输出二叉树:"); postordertraverse(ht); putchar('\\n'); } else printf("空二叉树\\n");} 展开 cheerj6 | 发布于2011-11-26...

C语言中的遍历是什么意思
所谓遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。简而言之,就是二叉树上每一个结点都被访问一次。分为先序、中序和后序遍历。

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

c语言 关于二叉树的创建和遍历(中序遍历)
CreateBiTree(BT,string);\/\/创建二叉树 printf("\\n中序遍历二叉树顺序为: ");inorder(BT);\/\/中序遍历二叉树 printf("\\n");}

精通c语言的亲们,关于二叉树节点怎么计算呢
首先,你要使用到二叉树的遍历。二叉树的遍历有中序遍历,前序遍历和后续遍历。不管你用的是哪一中遍历方式,只要你扫描的某个节点的左右孩子为空,那么该节点就是叶子节点,这时你的计数器加1就行。如:f(binary_tree * head){ int count = 0;binary_tree pt = head;if(head == NULL) break...

二叉树前序遍历法举例!急急急!!!
递归算法 算法描述:(1)若二叉树为空,结束 (2)后序遍历左子树 (3)后序遍历右子树 (4)访问根结点 伪代码 PROCEDURE POSTRAV(BT)IF BT<>0 THEN { POSTRAV(L(BT))POSTRAV(R(BT))OUTPUT V(BT)} RETURN c语言描述 struct btnode { int d;struct btnode *lchild;struct btnode *...

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

C语言二叉树前,中,后遍厉序列有什么规律,就是已知俩个,如何推出第三个...
中序: ADEFGHMZ 后续: AEFDHZMG 现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历?第一步,root最简单,前序遍历的第一节点G就是root。第二步,继续观察前序遍历GDAFEMHZ,除了知道G是root...

c语言,计算机基础,请问已知二叉树的中序遍历为BDCEAFHG,和后序遍 ...
中序遍历为BDCEAFHG(左根右)后序遍历EDCBHGFA(左右根)所以,根为A,左子树BDCE,右子树FHG 同理,再次可求得左子树BDCE中B应为左子树:但在后序遍历中B为EDCB中的根。所以,题目有错。如有疑问,请追问。

用C语言定义二叉树的二叉链表存储结构,完成二叉树的建立,先序中序后...
void print3(TLNode Tree){ \/\/后序遍历 if(Tree!=NULL){ print3(Tree->lchild);print3(Tree->rchild);printf("%d-",Tree->data);} } int leaf=0; \/\/求叶子节点数 int depth(TLNode Tree){ \/\/深度 int s1,s2;if(Tree==NULL)return 0;else{ s1=depth(Tree->lchild);s2=...

相似回答