二叉树依次遍历c语言的实现
二叉树第一次遍历的实现思想如下。
访问根节点;
访问当前节点的左子树;
如果当前节点没有左侧的子树,则访问当前节点右侧的子树。
以图1为例,用优先扫描的思想扫描这个二叉树的过程如下。
访问此二叉树的根节点,找到1;
访问节点1左侧的子树,找到节点2;
访问节点2左侧的子树,找到节点4;
由于对节点4左侧子树的访问失败,且没有右侧的子树,因此完成了以节点4为根节点的子树的遍历。 但是,节点2还没有遍历右侧的子树,现在就开始遍历。 这意味着您将访问节点5。
由于节点5没有左右子树,所以节点5的遍历完成,由此以节点2为根节点的子树也完成遍历。 返回节点1,开始遍历节点的右子树,即访问节点3。
访问节点3左侧的子树,找到节点6;
因为在节点6中没有左右的子树,所以节点6的遍历完成,返回节点3遍历其左右的子树,找到节点7;
由于在节点7上没有左右的子树,所以以节点3为根节点的子树的遍历完成,同时返回节点1。 由于节点1左右子树的遍历全部完成,二叉树整体的遍历完成;
因此,图1的二叉树使用先行扫描得到的系列如下。
1 2 4 5 3 6 7
代码实现
char emptyData='# '; /*当一个节点没有左右的孩子时,输出emptyData的值*/
//树的结构体定义
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
递归
语音保护(bitreet ) )。
{
if(t==null ) )。
{
printf('# ';
返回;
}
printf('%c ',T-data );
preordertraverse(t-lchild;
preordertraverse(t-rchild;
}
非递归(链栈)
堆栈定义
//堆栈
typedef int SElemType;
typedef struct StackNode
{
bi树型树节点;
struct StackNode *next;
}StackNode,*LinkStackPtr;
类型结构链接堆栈
{
链接堆栈ptr top;
int count;
(}链接堆栈;
堆栈方法
//堆栈
/*创建空堆栈S */
voidinitstack (链接堆栈* s ) )。
{
s-top=(linkstackptr ) malloc ) sizeof ) stacknode );
S-top=NULL;
S-count=0;
}
//进入堆栈/
voidpush(linkstack*s,BiTNode **q ) ) ) )。
{
链接堆栈ptr p;
p=(linkstackptr ) malloc ) sizeof ) stacknode );
p-TreeNode=*q;
p-next=S-top;
S-top=p;
S-count;
}
//出栈/
voidpull(linkstack*s,BiTNode **q ) )。
{
链接堆栈ptr p;
if(s-top ) )。
{
*q=S-top-TreeNode;
p=S-top;
S-top=S-top-next;
s-count----;
free(p;
}
}
返回/*s的元素数,即堆栈长度*/
intstacklength(linkstacks ) )。
{
return S.count;
}
非递归函数
voidpreordertraversebak1(bitreet,LinkStack *S ) )。
{
BiTNode *p=T,*q;
//表示空节点的
q-data=emptyData;
q-lchild=NULL;
q-rchild=NULL;
推式(s,p );
wile(s-count!=0)
{
pull(s,p );
printf('%c ',p-data );
if(p-rchild )。
{
push(s,) p-rchild );
}
ELSEif(p-data!=emptyData )
{
推式(s,q );
}
if(p-lchild ) )。
{
push(s,) p-lchild );
}
ELSEif(p-data!=emptyData )
{
推式(s,q );
}
}
打印((n );
}
思想:使用所述栈首先将所述第一节点放入栈中并确保所述栈中至少有一个元素。 只要堆栈不为空,就会一直使用一个while循环。 循环体中首先获取堆栈顶部节点,将其打印后直接进行堆栈,依次堆栈其右边的子节点和左边的子节点(如果存在)。 根据堆栈的FILO特性,最后进入堆栈的左边的孩子在下一个回合中将成为堆栈的顶级元素。 这样可以满足超前遍历的特点。
第二个非递归函数
voidpreordertraversebak2(bitreet,LinkStack *S ) )。
{
BiTNode *p=T;
wile(s-count!=0 || p )
{
是while(p )
{
printf('%c ',p-data );
推式(s,p );
p=p-lchild;
}
printf('%c”,emptyData );
pull(s,p );
p=p-rchild;
}
printf('%c”,emptyData );
}
思想:循环开始,从堆栈最上面的节点(第一次是根节点除外)开始左探索,堆栈打印直到左边的孩子空了; 然后指针指向堆栈顶部元素的右边子元素,打开下一个循环。