Leetcode 222. 完全二叉树的节点个数
题目:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
思路:
用一个队列来遍历二叉树的每一层,直到遇到一个节点的左孩子节点为空或者右孩子节点为空。
代码:
/**
* 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;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int result = 0;
H:
while (!queue.isEmpty()) {
int size = queue.size();
result += size;
//boolean lastEncouter = false;
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
} else {
result += 2 * i;
//lastEncouter = true;
break H;
}
if (node.right != null) {
queue.offer(node.right);
} else {
result += 2 * i + 1;
//lastEncouter = true;
break H;
}
}
}
return result;
}
}
但是我看到评论有个方法更加好:
class Solution {
public int countNodes(TreeNode root) {
/**
完全二叉树的高度可以直接通过不断地访问左子树就可以获取
判断左右子树的高度:
如果相等说明左子树是满二叉树, 然后进一步判断右子树的节点数(最后一层最后出现的节点必然在右子树中)
如果不等说明右子树是深度小于左子树的满二叉树, 然后进一步判断左子树的节点数(最后一层最后出现的节点必然在左子树中)
**/
if (root==null) return 0;
int ld = getDepth(root.left);
int rd = getDepth(root.right);
if(ld == rd) return (1 << ld) + countNodes(root.right); // 1(根节点) + (1 << ld)-1(左完全左子树节点数) + 右子树节点数量
else return (1 << rd) + countNodes(root.left); // 1(根节点) + (1 << rd)-1(右完全右子树节点数) + 左子树节点数量
}
private int getDepth(TreeNode r) {
int depth = 0;
while(r != null) {
depth++;
r = r.left;
}
return depth;
}
}
Golang版本
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
ld := depth(root.Left)
rd := depth(root.Right)
if ld == rd {
return 1 << ld + countNodes(root.Right);
} else {
return 1 << rd + countNodes(root.Left);
}
}
func depth(root *TreeNode) int {
if root == nil {
return 0
}
deep := 0
for root != nil {
deep++
root = root.Left
}
return deep
}
https://leetcode-cn.com/problems/count-complete-tree-nodes/comments/
cite from SEU.FidGet