day20 ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

● 654.最大二叉树
● 617.合并二叉树
● 700.二叉搜索树中的搜索
● 98.验证二叉搜索树

刷完四道二叉树相关算法题的总结

  1. 代码技巧

在编写二叉树相关算法时,需要考虑到二叉树的特性,即每个节点最多有两个子节点。因此,在编写递归算法时,可以通过传入当前节点的左子节点或右子节点来实现递归。另外,二叉搜索树的特性是左子树的节点值小于根节点,右子树的节点值大于根节点,因此在处理二叉搜索树问题时,可以利用这一特性进行递归或遍历操作。

  1. 刷题技巧

在刷题时,建议先理解题目要求和所给数据结构的特性,再考虑算法实现。对于二叉树相关题目,可以先画出样例树,通过观察样例树的特点来思考算法实现。另外,在编写递归算法时,需要注意递归的边界条件和返回值,以及递归中的变量传递。

  1. 部分核心Java代码

(1) 最大二叉树

public TreeNode constructMaximumBinaryTree(int[] nums) {
    if (nums == null || nums.length == 0) {
        return null;
    }
    int maxIndex = findMaxIndex(nums);
    TreeNode root = new TreeNode(nums[maxIndex]);
    root.left = constructMaximumBinaryTree(Arrays.copyOfRange(nums, 0, maxIndex));
    root.right = constructMaximumBinaryTree(Arrays.copyOfRange(nums, maxIndex + 1, nums.length));
    return root;
}

private int findMaxIndex(int[] nums) {
    int maxIndex = 0;
    for (int i = 1; i < nums.length; i++) {
        if (nums[i] > nums[maxIndex]) {
            maxIndex = i;
        }
    }
    return maxIndex;
}

(2) 合并二叉树

public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
    if (t1 == null) {
        return t2;
    }
    if (t2 == null) {
        return t1;
    }
    TreeNode root = new TreeNode(t1.val + t2.val);
    root.left = mergeTrees(t1.left, t2.left);
    root.right = mergeTrees(t1.right, t2.right);
    return root;
}

(3) 二叉搜索树中的搜索

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

(4) 验证二叉搜索树

public boolean isValidBST(TreeNode root) {
    return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}

private boolean isValidBST(TreeNode root, long minVal, long maxVal) {
    if (root == null) {
        return true;
    }
    if (root.val <= minVal || root.val >= maxVal) {
        return false;
    }
    return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值