重建二叉树---根据前序和中序遍历结果重建二叉树
2013-09-01 09:50
316 查看
一颗二叉树:
前序遍历结果: abdcef
中序遍历结果:dbaecf
基于递归的思想:在前序遍历中的第一个结点是根结点,然后在中序遍历中找到此根节点,然后递归的对左右子树分别重建。
顺说一下,知道前序和后序遍历结果,我无法重建二叉树的,因为当某个结点只有一个儿子结点的时候,无法区分出到底是左还是右结点。
前序遍历结果: abdcef
中序遍历结果:dbaecf
基于递归的思想:在前序遍历中的第一个结点是根结点,然后在中序遍历中找到此根节点,然后递归的对左右子树分别重建。
顺说一下,知道前序和后序遍历结果,我无法重建二叉树的,因为当某个结点只有一个儿子结点的时候,无法区分出到底是左还是右结点。
#include <iostream> #include <cstring> using namespace std; struct Binode { char data; Binode *lhs; Binode *rhs; }; void Rebuild_tree(char *preorder,char *inorder,int len,Binode *& root) { if(preorder==NULL || inorder==NULL) return ;// 检查边界条件 root=new Binode; root->data=preorder[0]; //前序遍历的第一个结点作为根结点。 root->lhs=root->rhs=NULL; if(len==1) return ; //当前树的长度为1,那么已经是最后一个结点。 int leftlen=0; char *pleftend=inorder; while(*preorder!=*pleftend) { if(preorder==NULL || pleftend==NULL) return ; pleftend++; } leftlen=(int)(pleftend-inorder); //左子树长度 int rightlen=len-leftlen-1; //右子树长度 //重建左子树 if(leftlen>0) { Rebuild_tree(preorder+1,inorder,leftlen,root->lhs); } //重建右子树 if(rightlen>0) { Rebuild_tree(preorder+leftlen+1,pleftend+1,rightlen,root->rhs); } } void Post_Traversal(Binode *root) { if(root->lhs) Post_Traversal(root->lhs); if(root->rhs) Post_Traversal(root->rhs); cout<<root->data<<" "; } int main() { char *preorder="abdcef"; char *inorder="dbaecf"; int len=strlen(inorder); Binode *root; Rebuild_tree(preorder,inorder,len,root); Post_Traversal(root); return 0; }
相关文章推荐
- 重建二叉树(根据前序和中序遍历结果)
- 第四题:根据前序和中序遍历结果重建二叉树(Arrays常用方法)
- 根据前序和中序遍历结果重建二叉树
- 重建二叉树---根据前序和中序遍历结果重建二叉树
- 根据前序和中序遍历结果重建二叉树
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- 重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字
- 根据二叉树的前序遍历和中序遍历结果重建二叉树
- 剑指offer刷题之c++实现的根据二叉树的前序和中序遍历重建二叉树
- 二叉树问题-根据前序遍历结果和中序遍历结果得出后序遍历结果
- 【面试题】剑指Offer-6-根据前序和中序遍历重建二叉树
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 编程之美--根据遍历结果重建二叉树
- 已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树
- 剑指:根据输入的前序和中续遍历序列重建二叉树
- 根据二叉树的前序遍历和中序遍历结果重建出该二叉树
- 根据前序和中序遍历重建二叉树
- 输入某二叉树的前序和中序遍历结果,重建该二叉树
- 根据二叉树的前序遍历和中序遍历的结果重建出该二叉树