其实树这个算法绕开了好久,因为一直都不会搞,每次都是试探着写。今天写,却发现流畅了些(我才不承认是因为写的简单分类的原因呢😕)
有可能是最近递归有了一点点感觉,也有可能是前两天算法题中涉及过深度的?
题目
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
思路
如题目一样,找树的深度。树简直是为了递归量身定做的。唔,也许动态规划也行?不过我目前还不太行。
3
/ \
9 20
/ \
15 7
大概是这个意思,先一直往下找,找到没有子树的结点。比如15和7。此时这两个结点都为零,然后往前找。
比如15和7到20值变成1,20到3变成2
9本来为0,到3是1.
2大于1,所以选2
代码
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
}
还有一道类似的,也许深度搜索的,所以这里就不写出来了:JZ79 判断是不是平衡二叉树
class Solution {
public boolean isBalanced(TreeNode root) {
//空树自然是平衡树啦
if(root == null) return true;
//相对函数左右子树之差小于2是平衡树
if(Math.abs(dfs(root.left)-dfs(root.right))<2) {
//判断其子树是否是平衡树
return isBalanced(root.left)&&isBalanced(root.right);
}
return false;
}
//二叉树深度
public int dfs(TreeNode root) {
if(root == null) return 0;
return Math.max(dfs(root.left),dfs(root.right))+1;
}
}