二叉树先序遍历,中序遍历,后序遍历,层次遍历。
2017-11-14 19:40
417 查看
原理
先序遍历又可叫前根序遍历,先遍历根节点,再遍历根节点的左子树,然后遍历根节点的右子树。
中序遍历
又可叫中根序遍历,先遍历根节点的左子树,再遍历根节点,然后遍历根节点的右子树。
后序遍历
又可叫后根序遍历,先遍历根节点的左子树,再遍历根节点的右子树,然后遍历根节点。
层次遍历
对整棵二叉树按从上到下,对每一层按从左到右的顺序进行遍历。这里我们需要借助队列:先访问节点的孩子节点也应比后访问节点的孩子节点先访问。故这就类似于队列先进先出的性质,每访问一个节点时,它的孩子节点(如果存在)就随着入队。
如图
先序遍历结果为——ABDHECFG
(首先从根节点开始,然后左节点,左节点成为根节点,然后再左节点,然后右节点(如果左子树遍历完后就遍历该根节点的右子树))
中序遍历结果为——HDBEAFCG
(当左节点被读取后,左节点被当作根节点)
后序遍历结果为——HDEBFGCA
(注意每个节点的左右子树必须遍历完)
层次遍历结果为——ABCDEFGH
先序遍历为 ABCDEFGHIJK
中序遍历为 CEDFBAHKJIG
后序遍历为 EFDCBKJIHGA
一些试题
已知部分遍历,求树或其他序列操作
迭代实现另外一种代码
//先序遍历 void preOrderWithoutRecursion() { if (!empty()) { //使用一个栈,栈的先进后出实现功能 stack<BTNode*> s; BTNode* p = root; //先将根节点存入栈 s.push(p); while (!s.empty()) { //首先输出当前节点 cout << setw(4) << p->data; //先存入右节点,栈的特性使之后出 if (p->rchild) s.push(p->rchild); //后存入左节点,栈的特性使之先出 if (p->lchild) p = p->lchild; else { //p为输出节点,根节点输出后,应该为左节点,然后释放栈顶 p = s.top(); s.pop(); } } cout << endl; } }
//中序遍历 void inOrderWithoutRecursion() { if (!empty()) { //利用栈的特性,先进后出。 stack<BTNode*> s; BTNode* p = Root; while (!s.empty() || p) { if (p) { //一直下降到最左边 s.push(p); p = p->lchild; } else { //当到底最左时,输出当前节点 p = s.top(); s.pop(); cout << setw(4) << p->data; //如果该左节点被视为根节点并有右节点,p设为右节点, p = p->rchild; } } cout << endl; } }
//后序遍历 void postOrderWithoutRecursion() { if (!empty()) { //利用栈特性,进行操作 stack<BTNode*> s; BTNode* p = Root; while (p != NULL) { //下降到最左边 s.push(p); p = p->lchild; } while (!s.empty()) { //判断当前该访问左节点还是右节点 BTNode* pLastVisit = p; //最左节点入栈 p = s.top(); s.pop(); //当右节点为空或前节点,则说明该节点为左节点,直接输出 if (p->rchild == NULL || p->rchild == pLastVisit) cout << setw(4) << p->data; //当左节点为前节点时,该点为根,该访问右节点 else if (p->lchild == pLastVisit) { s.push(p); p = p->rchild; s.push(p); //如果右节点作为根节点有左右子树,则进行该操作 while (p != NULL) { if (p->lchild != NULL) s.push(p->lchild); p = p->lchild; } } } cout << endl; } }
递归实现
void preorder (node *p) { if (p != NULL) { cout << p->data << " "; preorder(p->left); preorder(p->right); } } void inorder (node *p) { if (p != NULL) { inorder(p->left); cout << p->data << " "; inorder(p->right); } } void postorder (node *p) { if (p != NULL) { postorder(p->left); postorder(p->right); cout << p->data << " "; } }
参考
http://blog.csdn.net/zhangxiangdavaid/article/details/36634411
相关文章推荐
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- 二叉树-建树,层次遍历,先序遍历,中序遍历,后序遍历
- 二叉树的遍历(先序遍历,中序遍历,后序遍历,层次遍历)
- 二叉树的先序遍历、中序遍历、后序遍历、层次遍历的递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 给定二叉树的先序遍历中序遍历,求后序遍历
- 二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- 二叉树非递归先序遍历、中序遍历、后序遍历
- C++ 二叉树实现 创建,先序遍历,中序遍历,后序遍历
- 写出二叉树的先序遍历、中序遍历、后序遍历。
- 二叉树先序遍历,中序遍历,后续遍历 非递归版本+二叉树转换为string保存+二叉树的层次遍历+平衡二叉树判断
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 已知二叉树先序遍历,中序遍历创建二叉树并输出后序遍历
- 二叉树先序遍历,中序遍历和后序遍历的非递归实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- [算法] 二叉树的 先序遍历、中序遍历、后序遍历
- 二叉树先序遍历中序遍历建立二叉树然后后序遍历
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 二叉树重建 - (先序遍历、中序遍历、后序遍历)
- 已知二叉树先序遍历中序遍历求后序遍历