网站栏目怎么做301定向/优化公司
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; // 后序位置,遍历到叶子节点后进先出逐层返回当前节点的顺序,左叶子节点 -> 右叶子节点 -> 父节点}
};