二叉树的遍历(前序、中序、后序、层次)
来源:互联网 发布:购物车数据库表设计 编辑:程序博客网 时间:2024/06/11 18:35
本文主要介绍二叉树的四种遍历方式:前序、中序、后序和层次。以下图为例,说明这四种遍历方式:
前序遍历(DLR):先访问根节点,后访问左子树,再访问右子树。根-左-右,例如:ABDCEFGH
中序遍历(LDR):先访问根节点,后访问左子树,再访问右子树。左-根-右,例如:BDAFEHGC
后序遍历(LRD):先访问根节点,后访问左子树,再访问右子树。左-右-根,例如:DBFHGECA
层次遍历:从根节点开始,从上到下,从左至右,依次访问每个节点。例如:ABCDEFGH
非递归遍历
前序遍历(DLR):先访问根节点,后访问左子树,再访问右子树。根-左-右,例如:ABDCEFGH
中序遍历(LDR):先访问根节点,后访问左子树,再访问右子树。左-根-右,例如:BDAFEHGC
后序遍历(LRD):先访问根节点,后访问左子树,再访问右子树。左-右-根,例如:DBFHGECA
层次遍历:从根节点开始,从上到下,从左至右,依次访问每个节点。例如:ABCDEFGH
0.定义
二叉树的二叉链表存储表示
typedef int ElemType;typedef struct BiNode{ElemType data;struct BiNode *lchild, *rchild;}BiNode,*BiTree;
void visit(BiTree root){if(NULL != root)cout << root->data << endl;}
1.先序遍历
递归遍历
void preOrder(BiTree root){if(NULL != root){visit(root);preOrder(root->lchild);preOrder(root->rchild);}}
非递归遍历
void preOrder(BiTree root){stack<BiTree> s;BiTree p = root;while((NULL != p)|| !s.empty()){if( NULL != p)//访问根节点,根指针进栈,遍历左子树{visit(root);s.push(p);p = p->lchild;}else//根指针出栈,遍历右子树{p = s.top();s.pop();p = p->rchild;}}}
2.中序遍历
递归遍历
void inOrder(BiTree root){if(NULL != root){inOrder(root->lchild);visit(root);inOrder(root->rchild);}}
非递归遍历
void inOrder(BiTree root){stack<BiTree> s;BiTree p = root;while(NULL != p || !s.empty()){if(NULL != p)//根指针进栈,遍历左子树{s.push(p);p = p->lchild;}else//访问根节点,根指针出栈,遍历右子树{p = s.top();visit(p);s.pop();p = p->rchild;}}}
3.后序遍历
递归遍历
void postOrder(BiTree root){if(NULL != root){postOrder(root->lchild);postOrder(root->rchild);visit(root);}}
非递归遍历
void postOrder(BiTree root){stack<BiTree> s;//节点指针栈stack<int> flag;//访问标记栈,0表示访问过左子树,1表示访问过右子树BiTree p = root;while((NULL != p) || !s.empty()){while(NULL != p)//一直访问左孩子,直到左孩子指针为空{s.push(p);//根指针p进栈p = p->lchild;//p指向左孩子flag.push(0);//表示访问过左子树}if(flag.top() == 1)//访问过右子树{p = s.top();s.pop();//根指针出栈visit(p);flag.pop();//标记出栈p = NULL;}else//访问过左子树{p = s.top();//获取根指针if(!s.empty()){p = p->rchild;//访问右子树flag.pop();//更改访问标记flag.push(1);//右子树已访问过}}}}
4.层次遍历
void levelOrder(BiTree root){queue<BiTree> q;BiTree p = root;if(NULL == p)return;q.push(p);//根指针进队while(!q.empty()){p = q.front();q.pop();//根指针出队visit(p);//访问根节点if( NULL != p->lchild)//左孩子不空,进队q.push(p->lchild);else if(NULL != p->rchild)//右孩子不空,进队q.push(p->rchild);}}
0 0
- 二叉树的非递归遍历以及层次遍历(前序、中序、后序)
- 二叉树的遍历(前序、中序、后序、层次)
- 二叉树的遍历(前序、中序、后序、层次)
- 二叉树的遍历(前序、中序、后序、层次)
- 通过前序(后序), 中序遍历建立二叉树 求解层次遍历
- 二叉树遍历(前序、中序、后序、层次遍历、深度优先、广度优先)
- 二叉树遍历(前序、中序、后序、层次、深度优先、广度优先遍历)
- 二叉树--前序遍历、中序遍历、后序遍历、层次遍历
- 树的前序遍历,中序遍历,后序遍历,层次(广度)遍历
- 二叉树生成,前序、中序、后序、层次遍历的小例子!
- 关于二叉树的所有 前序、中序、后序、层次遍历
- 算法实验 二叉树的创建和前序-中序-后序-层次 遍历
- 二叉树的非递归前序、中序、后序、层次遍历
- 数据结构-二叉树的前序、中序、后序、层次遍历
- 二叉树的创建、二叉排序树、前序、中序、后序、层次遍历
- 二叉树的前序,后序,中序,层次遍历
- LintCode 二叉树的前序,中序,后序,层次遍历
- Java实现二叉树的前序、中序、后序以及层次遍历
- MySQL int(M)了解
- 使用dtree生成的树结构,ajax动态加载子节点后,如何绑定右键菜单续
- Spring3:如何配置静态文件映射?
- Android USB OTG功能如何打开及实现
- 2013-12-11 17:58:25
- 二叉树的遍历(前序、中序、后序、层次)
- Akka 对比 Storm
- EJB3: JBOSS 企业版、JBOSS服务器构架、EJB2.0 HelloWrold实例
- 第十六周-(项目二(1))指来指去。
- ajax,Struts2返回字符串乱码问题
- Sticky Listview Headers,分组title可固定可移动(仿iphone风格)
- javascript对象;jquery对象;DOM对象
- 决策树模型组合之随机森林与GBDT
- 第16周项目4-多科成绩(完善)