递归法
- 把构建树可以转化成构建子树,递归法的基础
- 并没有完全想象出整个过程,大致写法+边界处理left<right
- C++使用索引+引用的方式,python可以直接选择数组
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param preOrder int整型vector
* @param vinOrder int整型vector
* @return TreeNode类
*/
TreeNode* recrusion(vector<int>& preOrder,vector<int>& vinOrder,int preleft,int preright,int vinleft,int vinright)
{
if(preleft>preright||vinleft>vinright)
{
return nullptr;
}
TreeNode* root=new TreeNode(preOrder[preleft]);
int vinroot=vinleft;
for(int i=vinleft;i<=vinright;i++)
{
if(vinOrder[i]==preOrder[preleft])
{
vinroot=i;
break;
}
}
int lenleft=vinroot-vinleft;
int lenright=vinright-vinroot;
root->left=recrusion(preOrder,vinOrder,preleft+1,preleft+lenleft,vinleft,vinroot-1);
root->right=recrusion(preOrder,vinOrder,preleft+lenleft+1,preright,vinroot+1,vinright);
return root;
}
TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {
// write code here
// 1 2 4 7 3 5 6 8
// 4 7 2 1 5 3 8 6
return recrusion(preOrder,vinOrder,0,preOrder.size()-1,0,vinOrder.size()-1);
}
};
栈法 --待理解
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int n = pre.size();
int m = vin.size();
//每个遍历都不能为0
if(n == 0 || m == 0)
return NULL;
stack<TreeNode*> s;
//首先建立前序第一个即根节点
TreeNode *root = new TreeNode(pre[0]);
TreeNode *cur = root;
for(int i = 1, j = 0; i < n; i++){
//要么旁边这个是它的左节点
if(cur->val != vin[j]){
cur->left = new TreeNode(pre[i]);
s.push(cur);
//要么旁边这个是它的右节点,或者祖先的右节点
cur = cur->left;
}else{
j++;
//弹出到符合的祖先
while(!s.empty() && s.top()->val == vin[j]){
cur = s.top();
s.pop();
j++;
}
//添加右节点
cur->right = new TreeNode(pre[i]);
cur = cur->right;
}
}
return root;
}
};