嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。
题目描述
递归解法
做题思路
看到这个题目的第一想法是用递归,这个题目和求最大深度是一样的,只不过最大深度是返回其中的最大值,我们这个题目是返回和。上篇文章提到的递归三部曲,我们将该题往三部曲上面靠。进而求出节点数量,而且我们使用递归时,不需要考虑太多层,这样会让你的脑袋死机,你的脑子才能装几层呀,我们只需要考虑好眼前的层数,然后调用递归即可。
题目代码
class Solution {
public int countNodes(TreeNode root) {
return nodeNum(root);
}
//确定递归函数的参数和返回值
public int nodeNum(TreeNode root){
//确定终止条件
if(root == null){
return 0;
}
//确定单层条件
int leftnum = nodeNum(root.left);
int rightnum = nodeNum(root.right);
//这里和最大深数是不一样的,我们需要返回的是节点和,
//left代表的是左子树的节点个数,right代表的是右子树个数,
//你可以只考虑前两层进行思考,这样比较容易相通
return leftnum+rightnum+1
}
}
迭代法(BFS)
做题思路
用迭代来做比较容易理解,但是消耗的时间和内存较多,总的原理就是,我们通过队列,一层一层的将节点压入队列中,然后再出队来统计数目。思路很简答,代码实现也很简单。题目代码
class Solution {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
//创建队列
Queue<TreeNode> quene = new LinkedList<TreeNode>();
//头节点入队
quene.offer(root);
int count = 0;
while(!quene.isEmpty()){
int size = quene.size();
//统计节点数目
count+=size;
for(int i = 0;i<size;i++){
//出队
TreeNode p = quene.poll();
TreeNode left = p.left;
TreeNode right = p.right;
if(left!=null){
quene.offer(left);
}
if(right!=null){
quene.offer(right);
}
}
}
return count;
}
}
利用完全二叉树特性法
做题思路
完全二叉树的定义:它是一棵空树或者它的叶子节点只出在最后两层,若最后一层不满则叶子节点只在最左侧
完全二叉树在我们学数据结构的时候都有所了解。如果是满二叉树的时候,则节点数为2^h - 1;h代表二叉树的高度,如果不是满二叉树的时候,则需先通过公式求出前h-1层的节点数,再加上最后一层的节点数。
该算法的主要思想是,先分别求出左子树和右子树的高度,然后判断是否是满二叉树,然后分两种情况进行讨论。如果是满的情况先求出左子树的情况,然后再对右子树递归求个数。非满二叉树先求出右子树的个数,然后再对左子树进行递归求个数。这个方法是我跟一个大佬学的,如果不容易理解的话,可以点击这个网址,查看大佬的说明讲解。大佬讲解
题目代码
class Solution {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
int left = countLevel(root.left);
int right = countLevel(root.right);
if(left == right){
//这里的含义是1向左移动left位,则为2^left次方
return countNodes(root.right) + (1<<left);
}else{
return countNodes(root.left) + (1<<right);
}
}
//求出子树高度
private int countLevel(TreeNode root){
int level = 0;
while(root != null){
level++;
root = root.left;
}
return level;
}
}
总结
看到这个题目的时候想到了两种方法,第三种方法也想到了但是不知道应该如何实现,不过学会了别人的解题方法,不也是一种进步吗?
作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。