面试题6:重建二叉树
2016-05-28 22:47
357 查看
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出下图所示的二叉树并输出它的头结点。二叉树的定义如下:
template<typename T> struct BinaryTreeNode{ T data; BinaryTreeNode* left; BinaryTreeNode* right; BinaryTreeNode(T t=T()):data(t),left(NULL),right(NULL) {} };
![](http://www.sbrave.cn/wp-content/uploads/2016/05/无标题-300x225.png)
分析
对比二叉树的图形和其两个遍历序列来看,可以发现在前序遍历序列中第一个数字总是二叉树的根节点的值,然后在中序遍历序列中找到该值,它的前面就是它左子树上节点值的集合,后面就是它右子树上节点值的集合。由此就可以递归地在这两个集合中建立二叉树。BinaryTreeNode<data_type>* ConstructBinaryTree(vector<data_type>::iterator vlr,vector<data_type>::iterator lvr,int size) { if(size<=0) return NULL; BinaryTreeNode<data_type>* CurRoot=new BinaryTreeNode<data_type>(vlr[0]); vector<data_type>::iterator it=lvr; while(it!=lvr+size && *it!=CurRoot->data) it++; if(*it==CurRoot->data) { CurRoot->left=ConstructBinaryTree(vlr+1,lvr,it-lvr); CurRoot->right=ConstructBinaryTree(vlr+(it-lvr)+1,it+1,size-(it-lvr)-1); } return CurRoot; }
以上
如果你有任何想法或是可以改进的地方,欢迎和我交流!
完整代码及测试用例在github上:点我前往
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- Python实现二叉树结构与进行二叉树遍历的方法详解