零零散散做了很多道二叉树的建树问题,发现这类问题也是有规律可以探究的。
1 算法模版
Notes:- 1 递归返回值为TreeNode *
- 2 建立根节点
- 3 获取左子树(调用递归)
- 4 获取右子树(调用递归)
- 5 返回根节点
2 真题演练
2.1 106.从中序与后序遍历序列构造二叉树
class Solution {
public:
TreeNode* traversal(vector& inorder, vector& postorder){
// 1 判空
if(postorder.size() == 0) return nullptr;
// 2 去后序数组中根节点
int rootValue = postorder[postorder.size()-1];
TreeNode* root = new TreeNode(rootValue);
// 3 判断是否只有一个节点
if (postorder.size() == 1) return root;
// 4 找到中序数组的切割点
int delimiterIndex;
for(delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++){
if (inorder[delimiterIndex] == rootValue) break;
}
// 5 对中序数组进行切割
vector leftInorder(inorder.begin(), inorder.begin()+delimiterIndex);
vector rightInorder(inorder.begin()+delimiterIndex+1, inorder.end());
// postorder.resize(postorder.size()-1);
// 6 对后序数组进行切割
vector leftPostorder(postorder.begin(), postorder.begin()+leftInorder.size());
vector rightPostorder(postorder.begin()+leftInorder.size(), postorder.end()-1);
// 7 递归
root->left = traversal(leftInorder, leftPostorder);
root->right = traversal(rightInorder, rightPostorder);
return root;
}
TreeNode* buildTree(vector& inorder, vector& postorder) {
if (inorder.size()==0 || postorder.size()==0) return nullptr;
return traversal(inorder, postorder);
}
};
2.2 654.最大二叉树
class Solution {
public:
TreeNode* traversal(vector& nums){
if (nums.size() == 0) return nullptr;
// 1 找到最大值与下标,并创建root节点
int rootIndex, rootValue=INT_MIN;
for(int i = 0; i < nums.size(); i++){
if (rootValue < nums[i]){
rootValue = nums[i];
rootIndex = i;
}
}
TreeNode* root = new TreeNode(rootValue);
// 2 找到左子数组和右子数组
vector leftNums(nums.begin(), nums.begin()+rootIndex);
vector rightNums(nums.begin()+rootIndex+1, nums.end());
// 3 递归左子树
root->left = traversal(leftNums);
// 4 递归右子树
root->right = traversal(rightNums);
return root;
}
TreeNode* constructMaximumBinaryTree(vector& nums) {
return traversal(nums);
}
};
2.3 617.合并二叉树
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
// 1 判空
if (root1 == nullptr && root2 == nullptr) return nullptr;
else if (root1 && root2 == nullptr) return root1;
else if (root1 == nullptr && root2) return root2;
else{
root1->val += root2->val;
root1->left = mergeTrees(root1->left, root2->left);
root1->right = mergeTrees(root1->right, root2->right);
return root1;
}
}
};