更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
T:
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
该题目我想了好久,总是想在一个递归函数内解决这个问题,最后没能找出解决方案。
本题的关键在于两个部分的求解:
- 要计算每个节点的深度(或者计算该节点两个孩子节点的深度);
- 根据两个子节点的深度差判断该以该节点为子树的结构是否为平衡二叉树。
第一个问题的求解,就需要递归解决,第二个问题,也要递归解决。
比如:
节点a的两个子节点的深度差小于等于1,还要继续看两个子节点是否各自满足这个条件,即对每个子节点来说,其两个子节点是否也满足深度差小于等于1,如此递归下去,直到叶节点。
两个问题,就需要两个递归函数,各自执行各自的功能,而问题2的求解依赖于问题1的答案。
code:
/**
* T: 平衡二叉树
*
* 题目描述
* 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
*
* date: 2015.11.21 17:14
* @author SSS
*
*/
public class Solution {
/**
* 该函数的功能:
* 判断当前节点的左右节点其高度差是否大于1.
* 当大于1的时候返回false;
* 当不大于1的时候,要看其两个子节点是否也满足该条件。
* @param root
* @return
*/
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) {
return true;
}
int leftDepth = this.getDepth(root.left);
int rightDepth = this.getDepth(root.right);
if (Math.abs(leftDepth - rightDepth) > 1) {
return false;
}
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
}
/**
* 该函数的功能:当前节点为根节点的子树的深度
* @param rootTreeNode
* @return
*/
public int getDepth(TreeNode rootTreeNode) {
if (rootTreeNode == null) {
return 0;
}
int leftDepth = getDepth(rootTreeNode.left);
int rightDepth = getDepth(rootTreeNode.right);
int depth = Math.max(leftDepth, rightDepth);
return depth + 1;
}
}
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~