力扣106. 从中序与后序遍历序列构造二叉树

 常规题面,直接维护两种的遍历的下标位置进行递归即可。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     vector<int> inorder, postorder;
15     TreeNode* rebuild(int il, int ir, int pl, int pr) {
16         if (il > ir || pl > pr) return nullptr;
17         int root = postorder[pr];
18         int i; // 根结点在当前中序遍历[il,ir]中的位置
19         for (i = il; i <= ir; ++i) {
20             if (inorder[i] == root) break;
21         }
22         TreeNode * parent = new TreeNode(root);
23         // 根据划分后先序遍历的长度来确定划分后序遍历的长度
24         parent -> left = rebuild(il, i - 1, pl, pl + i - 1 - il);
25         parent -> right = rebuild(i + 1, ir, pl + i -il, pr - 1);
26         return parent;
27     }
28     TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
29         this -> inorder = inorder;
30         this -> postorder = postorder;
31         return rebuild(0, inorder.size() - 1, 0, postorder.size() - 1);
32     }
33 };

 

posted on 2025-03-30 21:35  Coder何  阅读(21)  评论(0)    收藏  举报