平衡二叉树(Java)

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点?的左右两个子树的高度差的绝对值不超过 1 。


示例 1:

        3
      /   \
    9     20
         /     \
      15       7

输入:root = [3,9,20,null,null,15,7]
输出:true

 

示例 2:

                    1
                   /  \
                 2    2
               /   \
            3     3
          /    \
       4        4

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

提示:
树中的节点数在范围 [0, 5000] 内
-10^{4} <= Node.val <= 10^{4}

 

package com.loo;

public class BalancedBinaryTree {

    public static void main(String[] args) {
        TreeNode root = new TreeNode(3);
        TreeNode left1 = new TreeNode(9);
        TreeNode right1 = new TreeNode(20);
        TreeNode right2 = new TreeNode(15);
        TreeNode right3 = new TreeNode(7);
        root.left = left1;
        root.right = right1;
        right1.left = right2;
        right1.right = right3;
        System.out.println(isBalancedBinaryTree1(root));
        System.out.println(isBalancedBinaryTree2(root));
        TreeNode root2 = new TreeNode(1);
        TreeNode left21 = new TreeNode(2);
        TreeNode right21 = new TreeNode(2);
        TreeNode left22 = new TreeNode(3);
        TreeNode left23 = new TreeNode(3);
        TreeNode left24 = new TreeNode(4);
        TreeNode left25 = new TreeNode(4);
        root2.right = right21;
        root2.left = left21;
        left21.left = left22;
        left21.right = left23;
        left22.left = left24;
        left22.right = left25;
        System.out.println(isBalancedBinaryTree1(root2));
        System.out.println(isBalancedBinaryTree2(root2));
    }
    
    public static boolean isBalancedBinaryTree1(TreeNode root) {
        if (root == null) {
            return true;
        }
        return Math.abs(getTreeHeight1(root.left) - getTreeHeight1(root.right)) <= 1 && isBalancedBinaryTree1(root.left) && isBalancedBinaryTree1(root.right);
    }
    
    public static int getTreeHeight1(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return Math.max(getTreeHeight1(root.left), getTreeHeight1(root.right)) + 1;
    }
    
    public static boolean isBalancedBinaryTree2(TreeNode root) {
        if (root == null) {
            return true;
        }
        return getTreeHeight2(root)>=0;
    }
    
    public static int getTreeHeight2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = getTreeHeight2(root.left);
        int rightHeight = getTreeHeight2(root.right);
        if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        }
        return Math.max(leftHeight, rightHeight) + 1;
    }
    
    static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;
        public TreeNode(int v) {
            value = v;
        }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平衡二叉树是一种特殊的二叉搜索树,它的左右子树高度差不超过1。Java中可以通过自定义节点类和旋转操作实现平衡二叉树。 以下是一个简单的平衡二叉树Java实现: ```java class Node { int val, height; Node left, right; Node(int val) { this.val = val; this.height = 1; } } class AVLTree { Node root; int height(Node node) { if (node == null) return 0; return node.height; } int balanceFactor(Node node) { if (node == null) return 0; return height(node.left) - height(node.right); } void updateHeight(Node node) { node.height = Math.max(height(node.left), height(node.right)) + 1; } Node rotateLeft(Node node) { Node right = node.right; node.right = right.left; right.left = node; updateHeight(node); updateHeight(right); return right; } Node rotateRight(Node node) { Node left = node.left; node.left = left.right; left.right = node; updateHeight(node); updateHeight(left); return left; } Node balance(Node node) { if (balanceFactor(node) > 1) { if (balanceFactor(node.left) < 0) { node.left = rotateLeft(node.left); } return rotateRight(node); } else if (balanceFactor(node) < -1) { if (balanceFactor(node.right) > 0) { node.right = rotateRight(node.right); } return rotateLeft(node); } updateHeight(node); return node; } Node insert(Node node, int val) { if (node == null) return new Node(val); if (val < node.val) { node.left = insert(node.left, val); } else { node.right = insert(node.right, val); } return balance(node); } void inorder(Node node) { if (node == null) return; inorder(node.left); System.out.print(node.val + " "); inorder(node.right); } } public class Main { public static void main(String[] args) { AVLTree tree = new AVLTree(); tree.root = tree.insert(tree.root, 10); tree.root = tree.insert(tree.root, 20); tree.root = tree.insert(tree.root, 30); tree.root = tree.insert(tree.root, 40); tree.root = tree.insert(tree.root, 50); tree.root = tree.insert(tree.root, 25); tree.inorder(tree.root); // 输出:10 20 25 30 40 50 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值