题目:
给定一棵二叉树的头节点head,返回这颗二叉树是不是平衡二叉树
1、解决方案1:
1.1、思路:
返回左子树的高度和右子树的高度
最后根据高度差判断是否为平衡二叉树
1.2、代码:
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
public static boolean isBalanced1(Node head) {
boolean[] ans = new boolean[1];
ans[0] = true;
process1(head, ans);
return ans[0];
}
//方案1:
public static int process1(Node head, boolean[] ans) {
if (!ans[0] || head == null) {
return 0;
}
//左子树的高度
int leftHeight = process1(head.left, ans);
//右子树的高度
int rightHeight = process1(head.right, ans);
//如果左右子树高度差大于1,那么该树就不是平衡二叉树
if (Math.abs(leftHeight - rightHeight) > 1) {
ans[0] = false;
}
//左右孩子高度取最大值,最后加上1,就是当前节点的高度
return Math.max(leftHeight, rightHeight) + 1;
}
2、解决方案2:
2.1、思路:
向左右子树分别要信息
返回左子树是否平衡以及高度,右子树是否平衡以及高度
最后根据信息来判断
2.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;
}
}
//方案2:向左右子树要信息,最后根据信息来判断
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;
//左树不平衡或右树不平衡或左右子树高度差大于1
// 那么以该节点为头部的子树就不是平衡数了
if (!leftInfo.isBalaced || !rightInfo.isBalaced || Math.abs(leftInfo.height - rightInfo.height) > 1) {
isBalanced = false;
}
return new Info(isBalanced, height);
}