LeetCode106. 从中序与后序遍历序列构造二叉树

题目

代码

 1 class Solution {
 2 public:
 3    
 4     TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
 5         //第一步
 6         if(postorder.size() == 0) return NULL;
 7 
 8         //第二步,后序数组的最后一个元素就是当前元素
 9         int rootValue = postorder[postorder.size()-1];
10         TreeNode *root = new TreeNode(rootValue);
11         if(postorder.size() == 1) return root; //只有一个根节点
12 
13         //第三步,找到后序数组最后一个元素在中序数组的位置,作为切割点
14         int Index;
15         for(Index = 0;Index < inorder.size();Index++){
16             if(inorder[Index] == rootValue) break;
17         }
18         
19         //第四步,切割中序数组,得到中序左数组、中序右数组
20         //采用左闭右开,[0,Index)
21         vector<int>leftInorder(inorder.begin(),inorder.begin()+Index);
22         //[Index+1,end)
23         vector<int>rightInorder(inorder.begin()+Index+1 ,inorder.end());
24 
25         //第五步,切割后序数组,得到后序左数组,后序右数组
26         postorder.pop_back(); //舍弃最后一个元素 postorder.erase(postorder.end()-1) 参数为迭代器 
27         //采用左闭右开
28         //[0,leftInorder.size)
29         vector<int>leftPostorder(postorder.begin(),postorder.begin()+leftInorder.size());
30         //[leftInorder.size,postorder.size)
31         vector<int>rightPostorder(postorder.begin()+leftInorder.size(),postorder.end());
32 
33         //第六步,递归处理左、右
34         root->left = buildTree(leftInorder,leftPostorder);
35         root->right = buildTree(rightInorder,rightPostorder);
36         return root;
37     }
38 };

注意:

1.stl 中 vector 赋初值的方法 :https://www.cnblogs.com/quyc/p/12857054.html

2. stl 中的容器和算法都是左闭右开的 https://www.zhihu.com/question/61054439

原文地址:https://www.cnblogs.com/fresh-coder/p/14514479.html