二叉树的遍历
来源:互联网 发布:xmt什么意思网络用语 编辑:程序博客网 时间:2024/06/05 08:53
二叉树的遍历
- 先序遍历的非递归遍历算法
- 中序遍历的非递归遍历算法
- 后序遍历的非递归遍历算法
先序遍历的非递归遍历算法
void InOrderTraversal(BinTree BT){ BinTree T = BT; Stack S = CreateStack(MaxSize); while(T||!IsEmpty(S)){ while(T){ Push(S,T); printf("%5d",T->Data); T = T->Left; } if(!IsEmpty(S)){ T = Pop(s); T =T->Right; } }}
中序遍历的非递归遍历算法
void InOrderTraversal(BinTree BT){ BinTree T = BT; Stack S = CreateStack(MaxSize); while(T||!IsEmpty(S)){ while(T){ Push(S,T); T = T->Left; } if(!IsEmpty(S)){ T = Pop(s); printf("%5d",T->Data); T =T->Right; } }}
后序遍历的非递归遍历算法
这是一个大神的想法。在此记录。
enum State {start,return_from_left,return_from_right};//以两次递归调用作为划分,将函数状态划为3类//还未递归调用自己,将左子树作为参数递归调用并返回后,将右子树作为参数递归调用并返回后typedef struct { enum State state; BinTree T;} StackElem;//省略栈的实现//后序遍历非递归void PostOrderTraversal (BinTree BT){ //item为当前执行的“函数”信息,栈中都是没有执行完的 StackElem item={start,BT}; Stack S=CreatStack(MaxSize); while (true){ //退出条件:需要返回上层时栈为空 if (item.T){ if (item.state==start){ //当前入栈并递归左子树 Push(S,item); item.T=item.T->left; item.state=start; } else if (item.state==return_from_left){ //当前入栈并递归右子树 Push(S,item); item.T=item.T->right; item.state=start; } else{ //item.state==return_from_right printf("%d",item.T->Data); //返回上一层 if (!IsEmpty(S)){ item=Pop(S); item.state++; } else{ //退出 break; } } } else{ if (!IsEmpty(S)){ item=Pop(S); item.state++; else{ //退出 break; } } } }
精彩之处,在于引用了一个状态量,用于记录函数的状态,记录第几次经过结点,在第三次经过结点的时候,将结点打印出来。
阅读全文
0 0
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- “堆”和“自由存储区”
- 常用的web服务器都支持一定的并发用户数,这个并发用户数可以通过配置文件参数来进行配置
- js的动态绑定事件和静态绑定事件的this的指向
- Qt: QLineEdit圆角边框,选中时变色,显示图标
- 解决FastJson中“$ref 循环引用”的问题
- 二叉树的遍历
- Python IDLE 快捷键
- 一个著名的日志系统Log4j
- spark基础之RDD和DataFrame和Dataset比较
- Android动画知识汇总
- caffe执行draw.py的错误汇总
- pthread_join与pthread_detach细节问题
- redis 入门
- 特殊权限和软硬链接