代码随想录算法训练营第十九天

文章介绍了在LeetCode中涉及的三种二叉树相关问题:最大二叉树的构建、合并两个二叉树以及在二叉搜索树中进行搜索和验证。通过递归实现展示了如何构造最大值节点并处理左右子树,以及合并两个有序的二叉树结构。

最大二叉树

654. 最大二叉树 - 力扣(LeetCode)

思路:按题目要求,单层逻辑是先取数组最大值做节点,然后最大值的左边就是左字树,右边就是右子树。如果left>right,则表示叶子节点。

C#代码:

public class Solution {
    public TreeNode ConstructMaximumBinaryTree(int[] nums) {
        return Construct(nums,0,nums.Length-1);
    }

    public TreeNode Construct(int[] nums, int left, int right){
        if(left > right){return null;}
        
        int best = left;
        for(int i=left + 1;i <= right;i++){
            if(nums[i]>nums[best]){
                best = i;
            }
        }
        TreeNode node = new TreeNode(nums[best]);
        node.left = Construct(nums,left,best -1 );
        node.right = Construct(nums,best+1,right);
        return node;
    }
}

合并二叉树

617. 合并二叉树 - 力扣(LeetCode)

public class Solution {
    public TreeNode MergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null){return root2;}
        if(root2 == null){return root1;}

        root1.val += root2.val;
        root1.left = MergeTrees(root1.left,root2.left);
        root1.right = MergeTrees(root1.right,root2.right);
        return root1;
    }
}

//就是两个二叉树一起遍历,都不是null就叠加,root1空就root2取代,反之root2空root1取代
//左子树的循环要两组二叉树的左子树,右子树也是一样的

二叉树搜索中的搜索

700. 二叉搜索树中的搜索 - 力扣(LeetCode)

代码:

public class Solution {
    public TreeNode SearchBST(TreeNode root, int val) {
        if(root == null || root.val == val){return root;}
        TreeNode node = null;
        if(root.val > val){
            node = SearchBST(root.left,val);
        }
        if(root.val < val){
            node = SearchBST(root.right,val);
        }
        return node;
    }
}

//主要因为二叉树搜索中的节点是有序的,可以直接判断节点和目标值的大小关系
//如果比目标值大,就搜索左子树;反之搜索右子树

验证二叉树搜索

98. 验证二叉搜索树 - 力扣(LeetCode)

代码:

public class Solution {
    long maxVal = long.MinValue;
    public bool IsValidBST(TreeNode root) {
        
        if(root == null){return true;}
        bool left = IsValidBST(root.left);
        if(maxVal < root.val){maxVal = root.val;}
        else return false;
        bool right = IsValidBST(root.right);

        return left && right;
    }
}

//虽然合格二叉树搜索是有序的,不过逻辑不能直接认为直接左边、右边分别和中间比较,
//说不定右子树的左节点还比中间小。然后要用中序遍历去做,左边每次和中间值(动态)
//比较,比中间值大就替换,小就返回false。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值