代码随想录算法训练营第十六天 | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
链接: 104.二叉树的最大深度
链接: 111.二叉树的最小深度
链接: 222.完全二叉树的节点个数
想法记录
104.二叉树的最大深度:深度是从根节点到叶子节点所经过的最多节点个数,高度是叶子节点到根节点所经过的最多节点个数。这道题其实层序遍历直接可以做出来,但是看卡哥说要掌握递归法。递归法首先考虑遍历方式,求深度和求高度对应的遍历方式是不一样的,求深度采用前序遍历方式,求高度采用后序遍历方式。所以这道题正规方法应该是前序遍历递归法,返回值为深度数值。递归结束条件是节点为null,递归函数的逻辑我并不是很理解,这里归总一下之前的题目的递归逻辑,也就是递归函数里面写的什么内容:
// 递归遍历
// 前序遍历
result.add(root.val); // 根节点的值加入result,处理逻辑
preorder(root.left, result); // 左
preorder(root.right, result); //右
// 递归遍历求最大深度
// 后序遍历
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
return Math.max(leftHeight,rightHeight)+1; //根节点汇总左右子树最大深度并且加1
通过这两个例子可以看出,递归遍历的函数逻辑里,在根节点进行处理,左右节点再次调用递归函数进行递归。
111.二叉树的最小深度:首先题目给出的定义是根节点到最近的叶子节点的距离,所以当根节点的某个子节点为空这种情况应该要单独注意一下。可以通过后序遍历求最小高度计算。因为用后序代码更简洁一些。
if(root==null) return 0;
int m1=minDepth(root.left);
int m2=minDepth(root.right);
return root.left==null||root.right==null?m1+m2+1:Math.min(m1,m2)+1;
222.完全二叉树的节点个数:对于普通二叉树,可以直接用递归或者层序遍历都行,但是完全二叉树更特殊的性质就没有体现出来。
自己实现过程中遇到哪些困难
对于完全二叉树怎么遍历求节点个数仍需要继续学习。