题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
好吧,对于这题,我依然用压栈的方法。
平衡二叉树定义:
平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
思路:首先利用压栈的方法计算出二叉树的每个节点的左右子节点的深度,然后左子节点深度减右子节点深度,结果如果大于1或小于-1则返回false。否则,继续遍历节点求左右子节点深度。在前一题我们讲了如何求二叉树的深度,本题基本就是利用求深度的方法来求解。
代码:
import java.util.*;
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
//当树为空或者树只有根节点是,直接返回true
if(root == null || (root.left == null && root.right == null)){
return true;
}
TreeNode head = root;
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<TreeNode> stack1 = new Stack<TreeNode>();
//遍历树节点,计算每个节点的左右子树的深度,并相减,结果大于1或小于-1就发回false
while(head != null){
int leftTreeDepth = 0;
int rightTreeDepth = 0;
//当左子树不为空时,计算左子树深度
if(head.left != null){
leftTreeDepth = TreeDepth(head.left);
}
//当右子树不为空时,计算右子树深度
if(head.right != null){
rightTreeDepth = TreeDepth(head.right);
}
int num = leftTreeDepth-rightTreeDepth;
if(num>1||num<-1){
return false;
}
//左子树不为空时,往左子树方向遍历
if((head.left != null)&&(-1 == stack1.search(head.left))){
stack.push(head.left);
head = head.left;
}
//右子树不为空时,往右子树方向遍历
else if((head.right != null)&&(-1 == stack1.search(head.right))){
stack.push(head.right);
head = head.right;
}
else{
stack1.push(stack.pop());
if(stack.isEmpty()){
break;
}
head = stack.peek();
}
}
return true;
}
//计算树深度函数
public int TreeDepth(TreeNode root){
TreeNode head = root;
int number = 1;
int endNumber = 0;
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<TreeNode> stack1 = new Stack<TreeNode>();
stack.push(head);
while(-1 == stack1.search(root)){
//左子树不为空时,往左子树方向遍历
if((head.left != null)&&(-1 == stack1.search(head.left))){
stack.push(head.left);
head = head.left;
number++;
}
//右子树不为空时,往右子树方向遍历
else if((head.right != null)&&(-1 == stack1.search(head.right))){
stack.push(head.right);
head = head.right;
number++;
}
else{
if(number > endNumber){
endNumber = number;
number--;
}else{
number--;
}
stack1.push(stack.pop());
if(stack.isEmpty()){
return endNumber;
}
head = stack.peek();
}
}
return endNumber;
}
}