题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路1:
平衡二叉树:二叉树的左右子树距离不超过1
递归:
遍历每一个节点,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
超过1,False
不超过1,左右子树都判断
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def IsBalanced_Solution(self, pRoot):
# write code here
if pRoot is None:#递归退出条件
return True
if abs(self.TreeDepth(pRoot.left)-self.TreeDepth(pRoot.right))>1:#根节点的左子树右子树判断
return False
return self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)#左子树右子树分别递归
def TreeDepth(self,Root):#判断树的深度
if Root is None:
return 0
left=self.TreeDepth(Root.left)
right=self.TreeDepth(Root.right)
return max(left,right)+1
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if (root==null) return true;
if (Math.abs(TreeDepth(root.left)-TreeDepth(root.right))>1) return false;
return (IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right));
}
private int TreeDepth(TreeNode pRoot){
if (pRoot==null) return 0;
int left=TreeDepth(pRoot.left);
int right=TreeDepth(pRoot.right);
return Math.max(left,right)+1;
}
}
这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。
思路2:
如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。
遍历过程中求书的高度
public class Solution {
private boolean isBalanced=true;
public boolean IsBalanced_Solution(TreeNode root) {
getDepth(root);
return isBalanced;
}
private int getDepth(TreeNode root){
if(root==null) return 0;
int left=getDepth(root.left);
int right=getDepth(root.right);
if(Math.abs(left-right)>1)
isBalanced=false;
return Math.max(left,right)+1;
}
}