程式碼隨想錄演算法訓練營第十七天| 654.最大二叉樹 , 617.合併二叉樹 , 700.二叉搜尋樹中的搜尋 , 98.驗證二叉搜尋樹

W-Vicky11發表於2024-11-09

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;
    }
};

相關文章