剑指offer_ 已知前序遍历与中序遍历,重建二叉树

二叉树重构算法
本文介绍了一种利用前序遍历和中序遍历数组重构二叉树的算法。通过递归方法,首先找到根节点,然后根据根节点在中序遍历中的位置划分左右子树,最终重构出完整的二叉树。

 由前序遍历和中序遍历即可确定一棵二叉树,前序遍历的第一个节点即为二叉树的根节点,则在中序遍历中可根据根节点的位置将中序遍历数组分为左子树部分和右子树部分,即可根据此性质采用递归的方法,依次确定二叉树的每一个节点,进而确定二叉树。

代码如下:

class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
      
        auto len1=pre.size();
        auto len2=vin.size();
        if(len1==0&&len2==0)
        {
            return nullptr;
        }
        return CreateTree(pre,vin,0,len1-1,0,len2-1);
    }
    
    TreeNode* CreateTree(vector<int> pre,vector<int> vin,int pStart,int pEnd,int vStart,int vEnd)
    {
        TreeNode *tree=new TreeNode(pre[pStart]);
        tree->left=nullptr;
        tree->right=nullptr;
        if(pStart==pEnd&&vStart==vEnd)
        {
            return tree;
        }
        int i=0;
        for(i=vStart;i<=vEnd;i++)//通过循环确定根节点在中序遍历中的位置
        {
            if(vin[i]==pre[pStart])
            {
                break;
            }
        }
        int leftLength=i-vStart;
        int rightLength=vEnd-i;
        //通过递归确定右子树和左子树中的每一个节点,直至叶子结点的孩子为空即返回二叉树
        if(leftLength>0)
        {
            tree->left=CreateTree(pre,vin,pStart+1,pStart+leftLength,vStart,i-1);
        }
        if(rightLength>0)
        {
            tree->right=CreateTree(pre,vin,pStart+leftLength+1,pEnd,i+1,vEnd);
        }
        return tree;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值