//提供两种方法来判断一棵二叉树是否平衡。 //第一种方法是通过递归的方式遍历整棵树,同时记录每个节点的高度差。如果发现某个节点的左右子树高度差大于1,则将结果标记为不平衡。最后返回的结果是一个布尔值,表示整棵树是否平衡。 //第二种方法是通过后序遍历的方式,从底部向上计算每个节点的高度,并在计算过程中检查子树是否平衡。这种方法不需要额外的空间来存储每个节点的高度,因此在某些情况下可能更高效。同样地,最后返回的结果是一个布尔值,表示整棵树是否平衡。 public static class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value = data; } } //法1 public static boolean isBalanced1(Node head){ boolean[] ans = new boolean[1]; ans[0] = true; process1(head , ans); return ans[0]; } public static int process1(Node head , boolean[] ans){ if(!ans[0] || head ==null){ return -1; } int leftHeight = process1(head.left , ans); int rightHeight = process1(head.right , ans); if (Math.abs(leftHeight - rightHeight) > 1){ ans[0] = false; } return Math.max(leftHeight , rightHeight) +1 ; } //法2 public static boolean isBalanced2(Node head){ return process2(head).isBalaced; } //信息返回的结构体 public static class Info{ //是否平衡 public boolean isBalaced; //高度为多少 public int height; public Info(Boolean b , int h){ isBalaced = b; height = h; } } public static Info process2(Node head){ if(head == null){ return new Info(true , 0); } //收集左树和右树的信息 Info leftInfo = process2(head.left); Info rightInfo = process2(head.right); //计算整棵树的高度 int height = Math.max(leftInfo.height , rightInfo.height) +1; boolean isBalanced = true; //限制平衡二叉树的条件 if(!leftInfo.isBalaced || !rightInfo.isBalaced || Math.abs(leftInfo.height - rightInfo.height)>1){ isBalanced = false; } //返回整合后的信息 return new Info(isBalanced , height); }
给一棵二叉树的头节点,判断是不是平衡二叉树(两种方法)
于 2024-07-30 21:50:35 首次发布