代码随想录day20|654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树

654. 最大二叉树

654. 最大二叉树

  • 分析:每次根据输入数组的最大值下标对数组进行left和right数组划分,划分的标准是,当且仅当最大值下标index>0才划分左数组,当且仅当index<nums.length才划分右数组,将当前最大值创建一个新node,最后递归处理即可。

  • 代码:

public TreeNode constructMaximumBinaryTree(int[] nums) {
    if(nums.length == 1){
        return new TreeNode(nums[0]);
    }
    int index = -1;
    int max = -1;
    for(int i = 0; i < nums.length; i++){
        if(nums[i] > max){
            max = nums[i];
            index = i; 
        }
    }
    TreeNode root = new TreeNode(max);
    if(index > 0){
        int[] left = Arrays.copyOfRange(nums, 0, index);
        root.left = constructMaximumBinaryTree(left);
    }
    if(index < nums.length - 1){
        int[] right = Arrays.copyOfRange(nums, index + 1, nums.length);
        root.right = constructMaximumBinaryTree(right);
    } 
    return root;
}

617. 合并二叉树

617. 合并二叉树

  • 分析:处理逻辑是中左右的前序遍历,遍历到当前节点时,值做相加,相加前判断节点是否为空,空则直接返回另一个树的节点即可,递归左子树时,两个树的左子树都需要加入递归,右子树的遍历逻辑相同。

  • 代码:

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

700. 二叉搜索树中的搜索

700. 二叉搜索树中的搜索

  • 分析:运用二叉搜索树的特性,将要搜索的值与当前节点的值做比较,如果小于当前节点,则向左递归,如果大于当前节点,则向右递归,如果等于当前节点,证明我们找到了要求的节点,直接返回即可,如果遍历到空节点仍然没有找到值,则返回空。

  • 代码:

public TreeNode searchBST(TreeNode root, int val) {
    if(root == null){
        return root;
    }
    if(root.val > val){
        return searchBST(root.left, val);
    }else if(root.val < val){
        return searchBST(root.right, val);
    }else{
        return root;
    }
}

98. 验证二叉搜索树

98. 验证二叉搜索树

  • 分析:运用二叉搜索树的特性,即中序遍历会产生一个单调递增的有序数组,因此在遍历过程中,采用中序遍历的方式,每次保存前一个树节点,如果当前节点值小于前一个节点就返回false,否则更新pre节点。

  • 代码:

TreeNode pre = null;
public boolean isValidBST(TreeNode root) {
    if(root == null){
        return true;
    }
    boolean left = isValidBST(root.left);
    if(pre != null && pre.val >= root.val){
        return false;
    }
    pre = root;
    boolean right = isValidBST(root.right);
    return left && right;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值