222. 完全二叉树的节点个数
题目
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1
提示:
- 树中节点的数目范围是
[0, 5 * 104]
0 <= Node.val <= 5 * 104
- 题目数据保证输入的树是完全二叉树
进阶:
遍历树来统计节点是一种时间复杂度为 O(n) 的简单解决方案。你可以设计一个更快的算法吗?
解题思路
思路
这题可以用层次遍历思路来求解(每遍历一层, 节点总数加上该层的节点数据),可以参阅二叉树的层序遍历
实现
// 用数组实现个简单的队列功能
type Queue struct {
elements []*TreeNode
}
func NewQueue() *Queue {
return &Queue{elements: make([]*TreeNode, 0)}
}
func (q *Queue) Push(node *TreeNode) {
q.elements = append(q.elements, node)
}
func (q *Queue) Pop() *TreeNode {
if q.IsEmpty() {
return nil
}
node := q.elements[0]
q.elements = q.elements[1:]
return node
}
func (q *Queue) Size() int {
return len(q.elements)
}
func (q *Queue) IsEmpty() bool {
if q.Size() == 0 {
return true
}
return false
}
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
q := NewQueue()
q.Push(root)
nodeSum := 0
for !q.IsEmpty() {
qSize := q.Size() // 代表当前这一层的元素, 一定要先取出size, q.Size()会一直变化
nodeSum += qSize
for i := 0; i < qSize; i++ {
topNode := q.Pop()
if topNode.Left != nil {
q.Push(topNode.Left)
}
if topNode.Right != nil {
q.Push(topNode.Right)
}
}
}
return nodeSum
}