/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
递归:
我写的:
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
if (root.left == null) return 1;
if (root.left != null && root.right == null) return 2;
return 1+countNodes(root.left)+countNodes(root.right);
}
}
实际上:
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
return 1+countNodes(root.left)+countNodes(root.right);
}
}
对递归的理解还是不够,最终判断仅仅是当前节点不为空,而我多余的两个判断
是因为原题是完全二叉树没用上,感觉不太好,就补上了,实际上这两行代码并没啥
用,可写可不写。
层序遍历做法:
class Solution {
// 迭代法
public int countNodes(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int result = 0;
while (!queue.isEmpty()) {
int size = queue.size();
while (size -- > 0) {
TreeNode cur = queue.poll();
result++;
if (cur.left != null) queue.offer(cur.left);
if (cur.right != null) queue.offer(cur.right);
}
}
return result;
}
}
用上完全二叉树性质的做法:
class Solution {
/**
* 针对完全二叉树的解法
*
* 满二叉树的结点数为:2^depth - 1
*/
public int countNodes(TreeNode root) {
if(root == null) {
return 0;
}
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
if (leftDepth == rightDepth) {// 左子树是满二叉树
// 2^leftDepth其实是 (2^leftDepth - 1) + 1 ,左子树 + 根结点
//这刚开始不太明白如何递归的,countNodes()方法其实就是求节点的方法,所以
//这里求出左子树的节点数加上右子树的节点数,右子树利用方法继续递归。
return (1 << leftDepth) + countNodes(root.right);
} else {// 右子树是满二叉树
return (1 << rightDepth) + countNodes(root.left);
}
}
//不断遍历左子树,遍历一次深度+1,直到末尾为空时结束。求二叉树的深度。
private int getDepth(TreeNode root) {
int depth = 0;
while (root != null) {
root = root.left;
depth++;
}
return depth;
}
}
11-24
179
09-27
297