105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

 


题目

传送门:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/


 


算法设计:根节点定位法 + 深度优先搜索 生成左右子树

构造二叉树,第一件事一定是找根节点,然后想办法构造左右子树。

前序遍历的特点是, 根节点出现在数组的第一位,而中序遍历中根节点出现在数组的中间位置。

所以我们只需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树的节点,右边就是右子树的节点。

  • 首先是找到前序遍历的根节点,然后在中序遍历中定位这个根节点的位置。这两步是构造二叉树的关键步骤,可以定义为“根节点定位方法”。

生成左子树和右子树就可以递归的进行了。

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        return build(preorder, inorder, 0, 0, inorder.size()-1);
    }
    
    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int& rootIdx, int left, int right) {
        if (left > right) return NULL;
        int pivot = left;
        while(inorder[pivot] != preorder[rootIdx]) pivot++;                  // 在中序遍历中,找到根节点的下标
        
        rootIdx++;                                                           // 前序遍历,根节点下标更新
        TreeNode* newNode = new TreeNode(inorder[pivot]);                    // 构造二叉树的根节点
        newNode->left = build(preorder, inorder, rootIdx, left, pivot-1);    // 构造二叉树的左子节点
        newNode->right = build(preorder, inorder, rootIdx, pivot+1, right);  // 构造二叉树的右子节点
        return newNode;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值