Sword55-II——平衡二叉树

博客围绕Sword55 - II平衡二叉树展开,介绍了两种解法。前序遍历是对每个节点判断左右子树最大深度绝对值是否小于等于1,再递归左右子节点;后序遍历从底部开始,判断左右子树深度绝对值,满足条件返回深度较大值加1,不满足则返回 -1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sword55-II——平衡二叉树

方法1——前序遍历

  • 思路:对于每一个节点,判断其左右子树的最大深度的绝对值小于等于1,即代表符合条件;继续对该节点的左子节点和右子节点进行递归即可
  • 特殊情况与临界分析:根节点非空判断
  • 终止条件:当前节点为空,深度返回0
  • 步骤:
    • 根节点非空判断
    • 返回是否符合条件
      • 当前节点的左子树深度和右子树深度的绝对值是否小于2
      • 其左子节点是否符合条件
      • 其右子节点是否符合条件
    • 递归求深度方法(可参考上一题的方法)
      • 终止条件:当前节点为空,深度为0
      • 递归求解左右子树深度,等于左右子树深度的较大值加1
    public boolean isBalanced(TreeNode root) {
        // 根节点非空判断
        if (root == null) {
            return true;
        }
        // 递归求解,三者都符合才为成功
        return (Math.abs(depth(root.left) - depth(root.right)) < 2) &&
            	(isBalanced(root.left)) &&
            	(isBalanced(root.right));
    }
	// 递归求解深度
	private int depth(TreeNode root) {
        // 终止条件
        if (root == null) {
            return 0;
        }
        // 递归求解左右子树深度
        return Math.max(depth(root.left), depth(root.right)) + 1;
    }

方法1——前序遍历

方法2——后序遍历

  • 思路:从底部开始,判断其左右子树深度绝对值是否小于2,满足则返回左右子树深度的较大值再加1,不满足则向上一直返回-1
  • 特殊情况与临界分析:无,因为是从底部开始向上遍历的
  • 终止条件:当前节点为空,深度为0
  • 步骤:
    • 判断递归方法返回的值是否为-1,不为-1代表是平衡二叉树
    • 递归方法
      • 参数:当前节点
      • 终止条件:当前节点为空,深度为0
      • 对其左子树递归,接收其结果
      • 判断左子树递归结果是否为-1,若为-1,则向上返回-1
      • 对其右子树递归,接收其结果
      • 判断右子树递归结果是否为-1,若为-1,则向上返回-1
      • 判断当前节点的左子树深度和右子树深度的绝对值是否小于2
        • 满足,则返回左右子树深度的较大值加1
        • 不满足,则返回-1
    public boolean isBalanced(TreeNode root) {
        // 判断递归方法返回值是否为-1,不为-1代表是平衡二叉树
        return recur(root) != -1;
    }
	// 递归方法
	private int recur(TreeNode root) {
        // 终止条件
        if (root == null) {
            return 0;
        }
        // 对其左子树递归
        int left = recur(root.left);
        // 判断左子树结果是否为-1
        if (left == -1) {
            // 是则向上返回-1
            return -1;
        }
        // 对其右子树递归
        int right = recur(root.right);
        // 判断右子树结果是否为-1
        if (right == -1) {
            // 是则向上返回-1
            return -1;
        }
        // 判断当前节点的左右子树深度绝对值是否小于2
        return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
    }

方法2——后序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值