654.最大二叉樹
文章連結:https://programmercarl.com/0654.最大二叉樹.html
題目連結:https://leetcode.cn/problems/maximum-binary-tree/description/
class Solution {
public:
TreeNode* traversal(vector<int>& nums,int left,int right){
if(left>=right) return NULL;
int maxValIndex=left;
for(int i=left;i<right;i++){
if(nums[i]>nums[maxValIndex]) maxValIndex=i;
}
TreeNode* root=new TreeNode(nums[maxValIndex]);
root->left=traversal(nums,left,maxValIndex);
root->right=traversal(nums,maxValIndex+1,right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums,0,nums.size());
}
};
617.合併二叉樹
文章連結:https://programmercarl.com/0617.合併二叉樹.html
題目連結:https://leetcode.cn/problems/merge-two-binary-trees/description/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1==NULL) return root2; //此時root2為空也沒有關係,那就是空節點
if(root2==NULL) return root1;
root1->val=root1->val+root2->val; //兩個都不為空
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};
700.二叉搜尋樹中的搜尋
文章連結:https://programmercarl.com/0700.二叉搜尋樹中的搜尋.html
題目連結:https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
//遞迴法
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root==NULL||root->val==val) return root;
if(val<root->val) return searchBST(root->left,val);
else return searchBST(root->right,val);
}
};
//迭代法
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while(root!=NULL){
if(val<root->val) root=root->left;
else if(val>root->val) root=root->right;
else return root;
}
return root;
}
};
98.驗證二叉搜尋樹
文章連結:https://programmercarl.com/0098.驗證二叉搜尋樹.html
題目連結:https://leetcode.cn/problems/validate-binary-search-tree/description/
錯誤寫法:(原因:對於一個有效的 BST,不僅需要滿足左子節點的值小於根節點的值,右子節點的值大於根節點的值,還必須確保左子樹所有節點的值都小於根節點,右子樹所有節點的值都大於根節點。因此,僅比較直接的左、右節點是不夠的。)
//以下為錯誤的程式碼!!!
class Solution {
public:
bool isValidBST(TreeNode* root) {
if(root==NULL) return true;
bool isValidLeft=true; //左子節點為空
if(root->left){
if(root->left->val<root->val) isValidLeft=isValidBST(root->left);
else return false;
}
bool isValidRight=true; //右子節點為空
if(root->right){
if(root->right->val<root->val) isValidRight=isValidBST(root->right);
else return false;
}
return isValidLeft&&isValidRight;
}
};
思路:二叉搜尋樹可以看它的中序序列,是從小到大的順序!!
class Solution {
public:
TreeNode* pre=NULL;
bool isValidBST(TreeNode* root) {
//中序遍歷並逐漸與前一個值進行比較即可
if(root==NULL) return true;
//左
bool left=isValidBST(root->left);
//中
if(pre!=NULL&&pre->val>=root->val) return false;
pre=root;
//右
bool right=isValidBST(root->right);
return left&&right;
}
};