重建二叉树(NC12/考察次数Top31/难度中等)

描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

示例1
输入:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:
{1,2,5,3,4,6,7}
(题目来自牛客网)

用C++实现如下

/**
 *                                //定义二叉树的结构,包括val,TreeNode* left和TreeNode* right
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //思路,输入某二叉树的前序遍历和中序遍历结果,重建改二叉树,重建二叉树就是求出root的val和其左右指针
        //前序遍历为 根 左(全部) 右(全部)
        //中序遍历为 左(全部) 根 右(全部)
        //前序和后序可以实现父子节点的分离,配合中序遍历,可以确定一棵树(前提是不含有重复的val值)
        //方法,使用递归算法进行求解
        return rebuild(pre, 0, pre.size()-1, vin, 0, vin.size()-1);    //使用rebuild递归函数进行求解;
    }
    
    TreeNode* rebuild(vector<int>& pre, int pre_left, int pre_right, 
                      vector<int>& vin, int vin_left, int vin_right){
        if(pre_left > pre_right)                                      //size等于0,表示为空,vin与之对应着
            return nullptr;
        TreeNode* root = new TreeNode(pre[pre_left]);                 //建立根节点,前序遍历第一个为根节点,括号中放val值;
        for(int i = vin_left; i<=vin_right; i++)                      //遍历中序,直到找到根节点的val;(由于不重复)
        {
            if(vin[i] == pre[pre_left])                               //碰到了根节点;
            {
                root->left = rebuild(pre, pre_left+1, pre_left+i-vin_left, vin, vin_left, i-1);
                //由于是根据中序进行遍历的,根据for循环可以知道,i-vin_left可以表示根节点左边有多少个元素
                root->right = rebuild(pre, pre_left+i-vin_left+1, pre_right, vin, i+1, vin_right);
                break;
            }
        }
        return root;                                                   //返回值
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
重建二叉树是一道经典的二叉树问题,其解题思路如下: 1. 首先,我们需要根据前序遍历序列和中序遍历序列来重建二叉树。前序遍历序列的第一个节点一定是二叉树的根节点,中序遍历序列中根节点左边的所有节点都属于二叉树的左子树,右边的所有节点都属于二叉树的右子树。 2. 我们可以通过前序遍历序列找到二叉树的根节点,然后在中序遍历序列中找到根节点的位置。根节点左边的所有节点都属于左子树,右边的所有节点都属于右子树。 3. 接下来,我们递归构建左子树和右子树。我们可以根据前序遍历序列和中序遍历序列中左右子树的节点数量确定左右子树的范围。 4. 重复以上步骤,直到遍历完整个序列,最终得到重建的二叉树。 下面是重建二叉树的代码实现,代码注释中有详细的解释。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): """ :type preorder: List[int] :type inorder: List[int] :rtype: TreeNode """ # 如果前序遍历序列和中序遍历序列为空,返回None if not preorder or not inorder: return None # 前序遍历序列的第一个节点一定是二叉树的根节点 root_val = preorder[0] root = TreeNode(root_val) # 在中序遍历序列中找到根节点的位置 root_index = inorder.index(root_val) # 递归构建左子树和右子树 left_preorder = preorder[1:root_index+1] left_inorder = inorder[:root_index] left = buildTree(left_preorder, left_inorder) right_preorder = preorder[root_index+1:] right_inorder = inorder[root_index+1:] right = buildTree(right_preorder, right_inorder) # 将左右子树连接到根节点上 root.left = left root.right = right return root ``` 以上就是重建二叉树的详细解题思路和代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值