LeetCode 剑指 Offer 07. 重建二叉树

该博客介绍了如何通过前序遍历和中序遍历的数组来构建二叉树。首先,从前序遍历中获取根节点,然后在中序遍历中找到根节点的位置,以此划分左子树和右子树。接着,递归地对左右子树进行相同的操作,直到遍历完整棵树。代码中展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接
思路:

  1. 根据前序遍历和后续遍历的原理,对数组进行划分,使用递归结构解决构建树的问题。
  2. 前序遍历的第一个元素是该数组构成树的根节点,在中序遍历中找到该元素,左边即为该根节点的左子树,右边为该根节点的右子树。
  3. 记录中序序列中左子树节点数,在前序序列中根据该数目得到左子树的前序序列和右子树序列。在中序序列中得到左子树的中序序列和右子树的中序序列。
  4. 对这两部分使用递归。
  5. 递归边界是子树为空。
  6. 树中不能有重复数字节点,不然会影响找根节点位置。
    数组切分结果
    给出代码:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.empty()) return NULL;
        TreeNode * root = new TreeNode(preorder[0]);
        int i = 0;
        
        // 去找根节点在中序遍历中的位置,该位置之前的就是左子树的节点
        // 右边是右子树的节点
        while(inorder[i] != preorder[0]){
            i++;
        }
        // 分别得到左子树的前序中序遍历数组,右子树的前序中序遍历数组
        vector<int> leftPreOrder(preorder.begin()+1,preorder.begin()+1+i);
        vector<int> leftInOrder(inorder.begin(), inorder.begin()+i);
        vector<int> rightPreOrder(preorder.begin()+1+i,preorder.end());
        vector<int> rightInOrder(inorder.begin()+1+i,inorder.end());
        
        // 对左右子树递归
        root->left =  buildTree(leftPreOrder,leftInOrder);
        root->right = buildTree(rightPreOrder,rightInOrder);
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值