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

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;                                        // 后序位置,遍历到叶子节点后进先出逐层返回当前节点的顺序,左叶子节点 -> 右叶子节点 -> 父节点
    
;

以上是关于889. 根据前序和后序遍历构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章

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

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

889. 根据前序和后序遍历构造二叉树(非递归)

构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果

面试题07-II 根据前序和后序遍历构造二叉树

面试题07-II 根据前序和后序遍历构造二叉树