树的遍历
来源:互联网 发布:知乎 代购 吐槽 编辑:程序博客网 时间:2024/05/21 22:21
1、树的前 中 后 序遍历:
树的前 中 后是相对树的根而言的,如前序遍历的次序是根、左子树、右子树;遍历算法分递归和非递归:
递归遍历:
- //先序遍历
- void PreOrder(BiTree T){
- if(T != NULL){
- //访问根节点
- Visit(T);
- //访问左子结点
- PreOrder(T->lchild);
- //访问右子结点
- PreOrder(T->rchild);
- }
- }
- //中序遍历
- void InOrder(BiTree T){
- if(T != NULL){
- //访问左子结点
- InOrder(T->lchild);
- //访问根节点
- Visit(T);
- //访问右子结点
- InOrder(T->rchild);
- }
- }
- //后序遍历
- void PostOrder(BiTree T){
- if(T != NULL){
- //访问左子结点
- PostOrder(T->lchild);
- //访问右子结点
- PostOrder(T->rchild);
- //访问根节点
- Visit(T);
- }
- }
非递归遍历:
前序遍历:
- /* 先序遍历(非递归)
- 思路:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。
- */
- void PreOrder2(BiTree T){
- stack<BiTree> stack;
- //p是遍历指针
- BiTree p = T;
- //栈不空或者p不空时循环
- while(p || !stack.empty()){
- if(p != NULL){
- //存入栈中
- stack.push(p);
- //访问根节点
- printf("%c ",p->data);
- //遍历左子树
- p = p->lchild;
- }
- else{
- //退栈
- p = stack.top();
- stack.pop();
- //访问右子树
- p = p->rchild;
- }
- }//while
- }
中序遍历:
- void InOrder2(BiTree T){
- stack<BiTree> stack;
- //p是遍历指针
- BiTree p = T;
- //栈不空或者p不空时循环
- while(p || !stack.empty()){
- if(p != NULL){
- //存入栈中
- stack.push(p);
- //遍历左子树
- p = p->lchild;
- }
- else{
- //退栈,访问根节点
- p = stack.top();
- printf("%c ",p->data);
- stack.pop();
- //访问右子树
- p = p->rchild;
- }
- }//while
- }
后序遍历:
- //后序遍历(非递归)
- typedef struct BiTNodePost{
- BiTree biTree;
- char tag;
- }BiTNodePost,*BiTreePost;
- void PostOrder2(BiTree T){
- stack<BiTreePost> stack;
- //p是遍历指针
- BiTree p = T;
- BiTreePost BT;
- //栈不空或者p不空时循环
- while(p != NULL || !stack.empty()){
- //遍历左子树
- while(p != NULL){
- BT = (BiTreePost)malloc(sizeof(BiTNodePost));
- BT->biTree = p;
- //访问过左子树
- BT->tag = 'L';
- stack.push(BT);
- p = p->lchild;
- }
- //左右子树访问完毕访问根节点
- while(!stack.empty() && (stack.top())->tag == 'R'){
- BT = stack.top();
- //退栈
- stack.pop();
- BT->biTree;
- printf("%c ",BT->biTree->data);
- }
- //遍历右子树
- if(!stack.empty()){
- BT = stack.top();
- //访问过右子树
- BT->tag = 'R';
- p = BT->biTree;
- p = p->rchild;
- }
- }//while
- }
2、树的深度遍历与广度遍历:
//深度优先遍历
void depthFirstSearch(Tree root){
stack<Node *> nodeStack; //使用C++的STL标准模板库
nodeStack.push(root);
Node *node;
while(!nodeStack.empty()){
node = nodeStack.top();
printf(format, node->data); //遍历根结点
nodeStack.pop();
if(node->rchild){
nodeStack.push(node->rchild); //先将右子树压栈
}
if(node->lchild){
nodeStack.push(node->lchild); //再将左子树压栈
}
}
}
//广度优先遍历
void breadthFirstSearch(Tree root){
queue<Node *> nodeQueue; //使用C++的STL标准模板库
nodeQueue.push(root);
Node *node;
while(!nodeQueue.empty()){
node = nodeQueue.front();
nodeQueue.pop();
printf(format, node->data);
if(node->lchild){
nodeQueue.push(node->lchild); //先将左子树入队
}
if(node->rchild){
nodeQueue.push(node->rchild); //再将右子树入队
}
}
}
本文摘自:http://blog.csdn.net/sjf0115/article/details/8645991
http://www.blogjava.net/fancydeepin/archive/2013/02/03/395073.html
- 二叉树的遍历(层遍历和深度遍历)
- 二叉树的前序中序后序遍历,非递归遍历 层次遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树遍历-----前序后序迭代遍历的新思路
- 二叉树的遍历-按层次遍历
- 二叉树的遍历(递归遍历)
- 二叉树的遍历-层次遍历
- 树的遍历
- 六、 树的遍历
- 二叉树的遍历
- haffman树的遍历
- 二叉树的遍历
- 树的各种遍历
- 树的遍历
- 二叉树的遍历
- C++树的遍历
- Java树的遍历
- 树的简单遍历
- Linux ipc------System V信号量
- 电动机的飞车问题
- 黑马程序员-------NSArray(NSMutableArray);
- $(document).ready(function (){})和$(function(){})无区别
- ID3算法
- 树的遍历
- Android开发————CoverFlow3D的实现
- spring原拦截器配置与新命名空间mvc:interceptors配置拦截器对比与注意事项
- 中国版Azure最新上线服务
- android控件拖动
- C++运算符优先级表
- [图文讲解]强大的谷歌搜索技巧,百度360搜狗什么的就是渣渣
- linux IO子系统和文件系统读写流程
- 动画的使用