您的位置:首页 > 职场人生

面试题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)
{}
};




分析

对比二叉树的图形和其两个遍历序列来看,可以发现在前序遍历序列中第一个数字总是二叉树的根节点的值,然后在中序遍历序列中找到该值,它的前面就是它左子树上节点值的集合,后面就是它右子树上节点值的集合。由此就可以递归地在这两个集合中建立二叉树。

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上:点我前往
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 剑指offer