旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
2009-10-10 22:52
357 查看
详细见注释乐,放码子:
附测试数据:
in:
11
7 1 0 2 3 4 68 22 32 93 87
0 1 2 3 4 7 22 32 68 87 93
out:
0 4 3 2 1 32 22 87 93 68 7
#include"stdafx.h" #include<iostream> #include<stack> using namespace std; typedef struct tr { int data; tr *left,*right; }tre,*tree;//先序是根左右,中序是左根右 stack<tree>st; tree re_creat(int *pre,int *mid,int n)//n是元素个数 { tree root; int *rot,k; if(n<=0) return NULL; root=new tre; root->data=*pre;//记录下先序遍历的第一个数,根 for(rot=mid;rot<mid+n;rot++)//拿着根到中序遍历序列中去划分地盘 if(*rot==*pre) break; k=rot-mid;//k跳到根所在的位置,表明为界限 root->left=re_creat(pre+1,mid,k);//分别在各自的地盘递归构造左子树和右子树,分封诸侯国 root->right=re_creat(pre+1+k,rot+1,n-1-k);//根节点的右子树 return root; } void lrb(tree root) { tree tmp; while(NULL!=root || !st.empty()) { if(NULL!=root) { st.push(root); root=root->left; } else { root=st.top(); if(root->right!=NULL && tmp!=root->right) root=root->right; else { root=tmp=st.top(); printf("%d ",root->data); st.pop(); root=NULL; } } } } int main() { int pre[100],mid[100],n,i; tree tmp; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&pre[i]); for(i=0;i<n;i++) scanf("%d",&mid[i]); tmp=re_creat(pre,mid,n); lrb(tmp);//后序遍历,确认结果正确 return false; }
附测试数据:
in:
11
7 1 0 2 3 4 68 22 32 93 87
0 1 2 3 4 7 22 32 68 87 93
out:
0 4 3 2 1 32 22 87 93 68 7
相关文章推荐
- 二叉树有先序遍历和中序遍历,构造出后序遍历
- PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
- 给出中序和后序遍历,构造二叉树以及给出前序和中序构造二叉树
- 根据先序和中序或后序和中序建立二叉树及树的遍历
- LeetCode: 106_Construct Binary Tree from Inorder and Postorder Traversal | 根据中序和后序遍历构建二叉树 | Medium
- 数据结构Step by Step之树(1)- 二叉树 前序、中序、后序 LeetCode105根据前序中序的顺序构造树
- LeetCode 根据前序和中序遍历构造二叉树的三种解法
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 根据中序和层次遍历序列,构造二叉树
- 根据前序遍历序列和中序遍历序列构造二叉树
- 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 如何根据前序、中序、后序遍历还原二叉树
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- [置顶] 数据结构之 二叉树的构造与遍历(先序,中序,后序,层次)
- 根据后序和中序遍历重建二叉树
- 二叉树根据先序遍历和中序遍历,得到后序遍历
- sdut oj2804 求二叉树的深度(根据中序以及后序遍历求树)
- 根据后序和中序遍历重建二叉树
- 二叉树:根据二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历