二叉树的所有的遍历算法
来源:互联网 发布:英文写作软件 知乎 编辑:程序博客网 时间:2024/05/15 05:38
声明
这些代码都不是直接搬过去马上能用的代码,只是学习思路,代码风格的。只给出了函数主体,并不是一个完整的c/c++文件。
递归前序遍历
void preOrder(Tree T){ if(T){ visit(T); preOrder(T->lchild); preOrder(T->rchild); }}
递归中序遍历
void inOrder(Tree T){ if(T){ preOrder(T->lchild); visit(T); preOrder(T->rchild); }}
递归后序遍历
void preOrder(Tree T){ if(T){ preOrder(T->lchild); preOrder(T->rchild); visit(T); }}
非递归前序遍历
void preOrder2(Tree T){ InitStack(S); Tree p=T; while(p!=NULL||!empty(S)){ if(p){ visit(p); push(S,p); p=p->lchild; } else{ pop(S,p); p=p->rchild; } }}
非递归中序遍历
void inOrder2(Tree T){ InitStack(S); Tree p=T; while(p!=NULL||!empty(S)){ if(p){ push(S,p); p=p->lchild; } else{ pop(S,p); visit(p); p=p->rchild; } }}
非递归后序遍历
void preOrder2(Tree T){ InitStack(S); Tree p=T; Tree r=NULL;//指向最近访问过的结点 while(p!=NULL||!empty(S)){ if(p){ push(S,p); p=p->lchild; } else{ GetTop(S,p); if(p->rchild&&r!=p->rchild){ p->rchild; push(S,p); p=p->lchild; } else{ pop(S,p); visit(p); r=p; p=NULL;//不赋值NULL则下一个循环判断又把这个结点压入栈中,这样就无限循环了。 } } }}
层次遍历:自上而下,从左往右
void levelOrder1(Tree T){ Queue Q; initQuque(Q); Tree p=T; if(T==NULL) return;//空树判断,空树则直接返回 inQueue(Q,p);//入队 while(!empty(Q)){ deQueue(Q,p);//出队 visit(p); if(p->lchild) inQueue(Q,p->lchild); if(p->rchild) inQueue(Q,p->rchild); }}
层次遍历:自上而下,从右往左
void levelOrder2(Tree T){ Queue Q; initQuque(Q); Tree p=T; if(T==NULL) return;//空树判断,空树则直接返回 inQueue(Q,p);//入队 while(!empty(Q)){ deQueue(Q,p);//出队 visit(p); if(p->rchild) inQueue(Q,p->rchild); if(p->lchild) inQueue(Q,p->lchild); }}
层序遍历:自下而上,从左往右
其实这个就是自上而下,从右到做的方式,在每次出队列后压入栈中,对栈中元素从栈顶访问到栈空即可。
void levelOrder3(Tree T){ Stack S; Queue Q; initStack(S); initQuque(Q); Tree p=T; if(T==NULL) return;//空树判断,空树则直接返回 inQueue(Q,p);//入队 while(!empty(Q)){ deQueue(Q,p);//出队 push(S,p); if(p->rchild) inQueue(Q,p->rchild); if(p->lchild) inQueue(Q,p->lchild); } while(!empty(S)){ pop(S,p); visit(p); }}
层序遍历:自下而上从右到左
这个也是同理,就是自上而下,从左到右的方式,每个结点出队列后被压入栈中,然后对栈中元素访问。
void levelOrder4(Tree T){ Stack S; Queue Q; initStack(S); initQuque(Q); if(T==NULL) return;//空树判断,空树则直接返回 Tree p=T; inQueue(Q,p);//入队 while(!empty(Q)){ deQueue(Q,p);//出队 push(S,p); if(p->lchild) inQueue(Q,p->lchild); if(p->rchild) inQueue(Q,p->rchild); } while(!empty(S)){ pop(S,p); visit(p); }}
阅读全文
0 0
- 二叉树的所有的遍历算法
- 二叉树所有相关遍历的算法
- 二叉树的遍历算法实现、以及所有简单操作
- 二叉树的遍历算法
- 二叉树的遍历算法
- 二叉树的遍历算法
- 二叉树的遍历算法
- 二叉树的遍历算法
- 遍历二叉树的算法
- 二叉树遍历的算法
- 二叉树的遍历算法
- 二叉树的遍历算法
- 遍历整个二叉树的所有路径
- 不使用递归和堆栈,遍历二叉树所有叶子节点的算法
- 【算法题】遍历二叉树的所有左叶子节点,求其值之和
- 二叉树的层次遍历的算法
- 二叉树遍历的非递归算法
- 二叉树遍历的递归算法程序
- hadoop--combiner、partitioner学习
- Android Dagger2
- input向后台传递值中含有括号
- 迷宫 dfs
- 2 Traffic Server限速插件
- 二叉树的所有的遍历算法
- LeetCode
- 常见文件字节码格式
- Python安装cx_Oracle模块和suds.client模块调用webservice服务
- 努力:论文CCCV 2017录取通知
- 轮播 多条目加载
- [LeetCode]420. Strong Password Checker深入浅出算法讲解和代码示例
- KMP算法模板
- idea 发布web项目