代码随想录算法训练营第十六天|LeetCode104,111,222
104.二叉树的最大深度
首先要明确二叉树深度与高度的概念
- 深度:任意一个节点到根节点的距离,根节点的深度为1
- 高度:任意一个节点到叶子节点的距离,叶子节点的深度为1.
通常情况下求高度会采用后续遍历,求深度会采用前序遍历,本题虽然是求最大深度,但是根节点的高度就是二叉树的最大深度,所以可以采用后续遍历。
此外另一关键点是当前节点的高度 = max(左子树高度,右子树高度)+1;
理清思路后,就可以写出:
public int maxDepth(TreeNode root) {
return getHight(root);
}
//后续遍历,求根节点的高度及最大深度
public int getHight(TreeNode node){
if (node == null) return 0;
int leftHight = getHight(node.left);//左
int rightHight = getHight(node.right);//右
int height = Math.max(leftHight,rightHight)+1;//中
return height;
}
迭代法可以采用层序遍历来进行。
111 二叉树的最小深度
本题乍一看可以在上一题的基础上直接将Math.max()修改为min即可,但是需要注意的是最小深度是从根节点到最近叶子节点的最短路径上的节点数量。注意是叶子节点,即左右均为null的节点。因此,在采用后续遍历的时候,处理中间节点时候的逻辑也要相应的进行改变。
public int minDepth(TreeNode root){
return getMinDepth(root);
}
public int getMinDepth(TreeNode node){
if (node == null) return 0;
int leftDepth = getMinDepth(node.left);
int rightDepth = getMinDepth(node.right);
if (node.left == null&&node.right!=null){
return 1+rightDepth;
}else if (node.left!=null&&node.right == null) {
return 1 + leftDepth;
}
return 1+Math.min(leftDepth,rightDepth);
}
迭代法同样可以采用层序遍历,需要注意是判断第一个叶子节点出现即可。
222.完全二叉树的节点个数
与获取二叉树的最大深度类似,本题中左右子树将各自的节点数量告诉父节点,因此,也可以采用递归的思路。
递归三部曲:
- 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。
- 确定终止条件:如果为空节点的话,就返回0,表示节点数为0。
- 确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量
public int countNodes(TreeNode root) {
return count(root);
}
public int count(TreeNode node){
if (node == null) return 0;
int leftNum = count(node.left);//左
int rightNum = count(node.right);//右
return leftNum+rightNum+1;//中
}
对于迭代法,可以采用层序遍历,记录每层有多少个节点。