力扣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 };
浙公网安备 33010602011771号