搞清楚深度和高度,深度:二叉树里任意一个节点到根节点的距离。高度:任意一个节点到叶子节点的距离。
求高度 -> 后序遍历,求深度 -> 前序遍历
从下往上怎么遍历?可以通过后续遍历来确定,左右中,我们把叶子节点的高度返回给父节点,然后中间这个点的高度就是高度+1.这样就实现了从低往上的顺序
求深度呢,中左右,往下遍历+1,
根节点的高度是二叉树的最大深度
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int lefHight = maxDepth(root.left);
int rightHight = maxDepth(root.right);
int hight = 1 + Math.max(lefHight,rightHight);
return hight;
}
}
思路:第一步确定函数参数和函数类型,因为返回值是int,传入的内容肯定是root。
第二步确定终止条件,if(nood == null) return 0;
第三步确定单层逻辑,后序遍历,左右中。
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
这道题和最大深度有什么区别?
叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点
当 root 节点左右孩子都为空时,返回 1
当 root 节点左右孩子有一个为空时,返回不为空的孩子节点的深度
当 root 节点左右孩子都不为空时,返回左右孩子较小深度的节点值
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
int leftDeep = minDepth(root.left); //左
int rightDeep = minDepth(root.right); //右
if(root.left == null && root.right!=null){
return rightDeep + 1;
}
if(root.right == null && root.left != null){
return leftDeep + 1 ;
}
return Math.min(leftDeep,rightDeep) + 1;
}
}
需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点。
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
递归法非常简单,只需要返回左右节点的个数,并加根节点就可以了。
- 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。
- 确定终止条件:如果为空节点的话,就返回0,表示节点数为0。
- 确定单层递归的逻辑:先求它的左子树的节点数量,再求的右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。