树的中序遍历
来源:互联网 发布:中国宏观经济数据分析 编辑:程序博客网 时间: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
- 树的中序遍历
- 树的中序遍历
- 树的中序遍历
- 树的前序遍历,中序遍历,后序遍历,层次(广度)遍历
- 二叉树的先序遍历,后序遍历,中序遍历,层次遍历
- 二叉树的遍历(1)--先序遍历,中序遍历,后序遍历
- 二叉树的遍历(前序遍历、中序遍历、后序遍历)
- 二叉树的遍历 前序遍历 中序遍历 后序遍历
- 树的遍历—先序遍历、中序遍历、后序遍历
- 二叉树的遍历代码(先序遍历,中序遍历,后序遍历)
- 二叉树的遍历:前序遍历、中序遍历和后序遍历
- c++ 二叉树的构建 前序遍历 中序遍历 后续遍历 层次遍历
- 树的遍历 有后序遍历和中序遍历建立二叉树,并输出层次遍历
- 二叉树的建立及遍历(先序遍历、中序遍历、后续遍历、层次遍历)
- 二叉树的遍历(2):中序遍历
- 树的非递归遍历(中序遍历)
- [转载]树的先序遍历,中序遍历,后序遍历的非递归写法
- 树的前序遍历、中序遍历与后序遍历的互相求解
- 初学卷积神经网络,基础知识与概念
- 两列或三列自适应布局
- 安卓开发之简易新闻客户端
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
- Shell script to build fdk-aac for use in iOS apps.
- 树的中序遍历
- form表单的各种属性简单列举
- 监听按钮的点击事件
- 数据挖掘数据的资料分享
- [leetcode: Python]24. Swap Nodes in Pairs
- 顶部导航条
- cocosstudio3.0以上版本控件高级属性之用户数据的使用
- Android studio打包签名报错:Error:(3) Error: "app_name" is not translated in "am" (Amharic);
- jmeter录制移动app脚本