树的中序遍历

来源:互联网 发布:中国宏观经济数据分析 编辑:程序博客网 时间:2024/05/22 10:54

递归算法

中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子,直至结束。

非递归算法

首先建立一个栈,定义一个常量flag(flag为0或者1),用flag记录结点的左子是否去过,没有去过为0,去过为1,默认为0.首先将指针指向根结点,将根结点入栈,然后将指针指向左子,左子作为新的结点,将新结点入栈,然后再将指针指向当前结点的左子,直至左子为空,则指针返回,flag置1,出栈一个元素,作为当前结点,打印该结点,然后判断flag,flag为1则将指针指向当前结点右子,将右子作为新的结点,结点入栈,再次进行上面的判断,直至当前结点右子也为空,则再出栈一个元素作为当前结点,一直到结束,使得当前结点右子为空,且栈空,遍历结束。

程序

递归算法

void inOrder(Node *root){    if(0 != root)    {        inOrder(root->lChild);        printf("%d",root->data);        inOrder(root->rChild);    }}

非递归算法

void inOrder(Node *root) //中序遍历{Stack ms; //声明一个栈Node curr = *root; //当前结点指向根结点 int flag = 0;//设置一个标志 0:当前结点指向了右结点 1:当前结点指向了左结点init(&ms); //初始化栈while(curr.data!=0||isEmpty(ms)) //当前结点不为空且栈不为空 {if(curr.lChild!=NULL&&flag==0) //左子不为空且没去过左子 {push(&ms,curr); //当前子进栈curr=*curr.lChild; //当前结点指向左子 }else{printf("%d ",curr.data); //打印当前结点的内容 if(curr.rChild!=NULL) //左子为空{ curr=*curr.rChild; //指向左子 } flag=0; //flag 置 0 } if(curr.rChild==NULL&&curr.lChild==NULL) //如果左右子都为空 { printf("%d ",curr.data); //打印当前结点的内容 if(isEmpty(ms)==1) break; //栈空 则结束循环 curr = pop(&ms); //当前子指向pop出栈的结点 flag=1; //flag 置 1 } } }
阅读全文
0 0
原创粉丝点击