889. 根据前序和后序遍历构造二叉树

889. 根据前序和后序遍历构造二叉树

 


题目

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

 


算法设计:深度优先搜索

1、首先把前序遍历结果的第一个元素或者后序遍历结果的最后一个元素确定为根节点的值。

2、然后把前序遍历结果的第二个元素作为左子树的根节点的值。

3、在后序遍历结果中寻找叶子节点的值,递归构造左右子树即可。

class Solution {
public:
    int preIndex = 0, posIndex = 0;
    TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
        TreeNode* root = new TreeNode(pre[preIndex++]);     // 按照前序遍历顺序(根、左、右)构造根节点,初始为第1个元素,并更新到下一个位置
        if (root->val != post[posIndex])                    // 如果前序遍历的当前节点值 != 左叶子节点,说明这条路径还没构造好    
            root->left = constructFromPrePost(pre, post);   // 构造左子树
            
        if (root->val != post[posIndex])                    // 如果前序遍历的当前节点值 != 右叶子节点,说明这条路径还没构造好    
            root->right = constructFromPrePost(pre, post);  // 构造右子树
            
        // 后序位置:从最后一层叶子节点,逆着模拟递归调用过程
        posIndex++;                                         // 后序位置,构造好一条路径后+1,更新新的叶子节点位置
        return root;                                        // 后序位置,遍历到叶子节点后进先出逐层返回当前节点的顺序,左叶子节点 -> 右叶子节点 -> 父节点
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值