Day18_平衡树_剑指Offer
二叉树的深度
Easy 原题连接:二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
示例:
3
/ \
9 20
/ \
15 7
返回:3
限制:
节点总数 <= 10000
解题思路
获得二叉树最大深度,可以叫二叉树自根节点遍历至每一个子节点,记录最大深度并返回
也可以拆分任务:获得每一个子节点的最大深度并返回
对于每一个节点而言,获取其左右节点的深度,取大值 + 1 ( 当前节点 ) 并返回
需要额外考虑的就是叶子节点,当前遍历到叶子节点时,判断左右为null的分支深度为0即可
Java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
}
平衡二叉树
Esay 原题连接:平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例:
3
/ \
9 20
/ \
15 7
输出: True
1
/ \
2 2
/ \
3 3
/ \
4 4
输出:False
提示:
0 <= 树的结点个数 <= 10000
解题思路
判断某树是否是平衡二叉树时,需要确定二叉树中任意节点的左右子树深度差不超过1
对于每一棵子树,都需要知道其左右子树深度,也需要向上返回深度+1以告知父节点当前最大深度
定义一个成员变量 flag 检测是否存在非平衡树的子树,当完成遍历后,flag 仍未改变则说明当前树为平衡二叉树
否则不是
Java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
boolean flag = true;
public boolean isBalanced(TreeNode root) {
int ans = treeLen(root);
return flag;
}
public int treeLen(TreeNode root) {
if(!flag) return 0;
if(root == null) return 0;
int leftLen = treeLen(root.left);
int rightLen = treeLen(root.right);
if(leftLen - rightLen >=-1 && leftLen - rightLen <= 1) {
return 1 + Math.max(leftLen, rightLen);
}
flag = false;
return 0;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!