面试题6:重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复数字。例如输入前序遍历序列{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上:点我前往

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值