class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size() == 0)
return NULL;
int rootVal = postorder[postorder.size()-1];
TreeNode* root = new TreeNode(rootVal);
if(inorder.size() == 1)
return root;
int index = 0;
while(inorder[index++] != rootVal);
index--;
vector<int> leftIn(inorder.begin(),inorder.begin()+index);
vector<int> rightIn(inorder.begin()+index+1,inorder.end());
vector<int> leftPost(postorder.begin(),postorder.begin()+index);
vector<int> rightPost(postorder.begin()+index,postorder.end()-1);
root->left = buildTree(leftIn,leftPost);
root->right = buildTree(rightIn,rightPost);
return root;
}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0)
return NULL;
TreeNode* root = new TreeNode(preorder[0]);
if(preorder.size() == 1)
return root;
int index = 0;
while(inorder[index++] != preorder[0]);
index--;
vector<int> leftIn(inorder.begin(),inorder.begin()+index);
vector<int> rightIn(inorder.begin()+index+1,inorder.end());
vector<int> leftPre(preorder.begin()+1,preorder.begin()+index+1);
vector<int> rightPre(preorder.begin()+index+1,preorder.end());
root->left = buildTree(leftPre,leftIn);
root->right = buildTree(rightPre,rightIn);
return root;
}
};
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size() == 0)
return NULL;
int max = INT_MIN,maxi=0;
for(int i=0;i<nums.size();i++){
if(max<nums[i]){
max=nums[i];
maxi=i;
}
}
TreeNode* root = new TreeNode(max);
vector<int> left(nums.begin(),nums.begin()+maxi);
vector<int> right(nums.begin()+maxi+1,nums.end());
for(int i=0;i<left.size();i++)
cout<<left[i]<<" ";
cout<<endl;
for(int i=0;i<right.size();i++)
cout<<right[i]<<" ";
cout<<endl;
root->left = constructMaximumBinaryTree(left);
root->right = constructMaximumBinaryTree(right);
return root;
}
};
法一:递归
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1) return root2;
if(!root2) return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left,root2->left);
root1->right = mergeTrees(root1->right,root2->right);
return root1;
}
};
法二:迭代
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2;
if (t2 == NULL) return t1;
queue<TreeNode*> que;
que.push(t1);
que.push(t2);
while(!que.empty()) {
TreeNode* node1 = que.front(); que.pop();
TreeNode* node2 = que.front(); que.pop();
// 此时两个节点一定不为空,val相加
node1->val += node2->val;
// 如果两棵树左节点都不为空,加入队列
if (node1->left != NULL && node2->left != NULL) {
que.push(node1->left);
que.push(node2->left);
}
// 如果两棵树右节点都不为空,加入队列
if (node1->right != NULL && node2->right != NULL) {
que.push(node1->right);
que.push(node2->right);
}
// 当t1的左节点 为空 t2左节点不为空,就赋值过去
if (node1->left == NULL && node2->left != NULL) {
node1->left = node2->left;
}
// 当t1的右节点 为空 t2右节点不为空,就赋值过去
if (node1->right == NULL && node2->right != NULL) {
node1->right = node2->right;
}
}
return t1;
}
};