二叉树的前序遍历,中序遍历,后序遍历以及相互之间的求法
2017-08-11 17:01
429 查看
我们都知道,二叉树有三种遍历方法,分别是前序遍历,中序遍历,后序遍历。假设我们有这么一颗树:
画得很丑,不要喷我......
那么前序遍历就是从根节点开始,到左子树,再到右子树,按照上面的图就是1->2->4->5->3->6->7
中序遍历就是先遍历左子树,再访问根节点,最后访问右子树,按照上面的图就是4->2->5->1->6->3->7
后序遍历就是先遍历左子树,再遍历右子树,最后遍历根节点,按照上面的图就是4->5->2->6->7->3->1
下面给出建立一颗二叉树的代码,我们使用上面的图的这棵树
输入:
还是用上面的图。我们可以得到前序遍历为:1 2 4 5 3 6 7 ,中序遍历为 4 2 5 1 6 3 7
我们观察一下,前序遍历的第一个必定是它的根节点,再看中序遍历,我们可以得到它的左子树和右子树,到这里,我们几乎可以想象出这棵树的样子了,那么怎么求呢
我们来模拟一下:首先我们必须先得到它的根节点,那么在中序遍历中,根节点左边的必定是它的左子树,在从前序遍历看2 4 5三个点,按照前序遍历的特点我们很容易得到左子树。我们再访问左子树的左子树,那么就是4这个点,4没有孩子了,我们就退回去找2 4 5 这个子树的右子树。以此类推...........我们会发现,这就是一个递归的过程
那么给出一个树的中序遍历和后序遍历求出前序遍历呢?其实也是个递归的过程,思路和上面差不多。
画得很丑,不要喷我......
那么前序遍历就是从根节点开始,到左子树,再到右子树,按照上面的图就是1->2->4->5->3->6->7
中序遍历就是先遍历左子树,再访问根节点,最后访问右子树,按照上面的图就是4->2->5->1->6->3->7
后序遍历就是先遍历左子树,再遍历右子树,最后遍历根节点,按照上面的图就是4->5->2->6->7->3->1
下面给出建立一颗二叉树的代码,我们使用上面的图的这棵树
输入:
1 2 4 0 0 5 0 0 3 6 0 0 7 0 0代码:
#include<stdio.h> #include<stdlib.h> typedef struct treenode{ int data; struct treenode *lchild; struct treenode *rchild; }TreeNode; TreeNode *creat(){ TreeNode *temp; int data; scanf("%d",&data); //没有儿子就输入0 if(data==0) temp=NULL; else{ temp=(TreeNode*)malloc(sizeof(TreeNode)); temp->data=data; temp->lchild=creat(); temp->rchild=creat(); } } //前序遍历 void preOrderTraverse(TreeNode *root){ if(root){ printf("%d ",root->data); preOrderTraverse(root->lchild); preOrderTraverse(root->rchild); } } //中序遍历 void inOrderTraverse(TreeNode *root){ if(root){ inOrderTraverse(root->lchild); printf("%d ",root->data); inOrderTraverse(root->rchild); } } //后序遍历 void lastOrderTraverse(TreeNode *root){ if(root){ lastOrderTraverse(root->lchild); lastOrderTraverse(root->rchild); printf("%d ",root->data); } } int main(){ TreeNode *tree=creat(); printf("前序遍历:"); preOrderTraverse(tree); putchar('\n'); printf("中序遍历:"); inOrderTraverse(tree); putchar('\n'); printf("后序遍历:"); lastOrderTraverse(tree); }给出一个二叉树的前序遍历和中序遍历,怎么求出它的后序遍历呢?
还是用上面的图。我们可以得到前序遍历为:1 2 4 5 3 6 7 ,中序遍历为 4 2 5 1 6 3 7
我们观察一下,前序遍历的第一个必定是它的根节点,再看中序遍历,我们可以得到它的左子树和右子树,到这里,我们几乎可以想象出这棵树的样子了,那么怎么求呢
我们来模拟一下:首先我们必须先得到它的根节点,那么在中序遍历中,根节点左边的必定是它的左子树,在从前序遍历看2 4 5三个点,按照前序遍历的特点我们很容易得到左子树。我们再访问左子树的左子树,那么就是4这个点,4没有孩子了,我们就退回去找2 4 5 这个子树的右子树。以此类推...........我们会发现,这就是一个递归的过程
#include<iostream> using namespace std; struct TreeNode{ int data; }; void search(int *front,int *mid,int len){ if(len==0) return; TreeNode *node=new TreeNode; node->data=front[0]; int rootkount; for(rootkount=0;rootkount<len;rootkount++){ if(mid[rootkount]==front[0]){ break; } } search(front+1,mid,rootkount); search(front+rootkount+1,mid+rootkount+1,len-(rootkount+1)); cout<<node->data<<" "; return; } int main(){ int n; //输入节点个数 cin>>n; int front ; int mid ; //给出前序遍历 for(int i=0;i<n;i++) cin>>front[i]; //给出中序遍历 for(int i=0;i<n;i++) cin>>mid[i]; cout<<"后序遍历是:"<<endl; search(front,mid,n); }
那么给出一个树的中序遍历和后序遍历求出前序遍历呢?其实也是个递归的过程,思路和上面差不多。
#include<iostream> using namespace std; struct TreeNode{ int data; }; void search(int *mid,int *behind,int len){ if(len==0) return; TreeNode *node=new TreeNode; node->data=behind[len-1]; cout<<node->data<<" "; int rootCount; for(rootCount=0;rootCount<len;rootCount++){ if(mid[rootCount]==behind[len-1]){ break; } } search(mid,behind,rootCount); search(mid+rootCount+1,behind+rootCount,len-(rootCount+1)); return; } int main(){ int n; //节点个数 cin>>n; int mid ; int behind ; //输入中序遍历 for(int i=0;i<n;i++) cin>>mid[i]; //输入后序遍历 for(int i=0;i<n;i++) cin>>behind[i]; search(mid,behind,n); }
相关文章推荐
- 数据结构之二叉树的前序遍历、中序遍历、后序遍历、层序遍历
- java编写二叉树以及前序遍历、中序遍历和后序遍历
- 数据结构与算法——二叉树的前序遍历,中序遍历,后序遍历
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 已知二叉树的前序遍历,中序遍历,求后序遍历的问题。
- 简单二叉树的构造,前序遍历顺序为;中序遍历顺序为;后序遍历顺序为;
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 二叉树以及前序遍历、中序遍历和后序遍历
- 二叉树经典面试题解析一:用非递归实现二叉树的前序遍历,中序遍历,后序遍历
- 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法
- 二叉树的前序遍历、中序遍历及后序遍历
- 二叉树的前序遍历,中序遍历,后序遍历代码
- java版的二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- 对于已知二叉树的中序遍历和后序遍历如何求二叉树的的前序遍历
- 二叉树的前序遍历、中序遍历和后序遍历的递归和非递归算法
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
- C++实现二叉树 前序遍历, 后序遍历, 中序遍历, 层序遍历(不用递归)
- LintCode:二叉树的前序遍历、中序遍历、后序遍历
- 数据结构之二叉树的前序遍历、中序遍历、后序遍历、层序遍历
- 二叉树的前序遍历、中序遍历、后序遍历概念