LeetCode 222. 完全二叉树的节点个数
题目链接:LeetCode 222. 完全二叉树的节点个数
题意:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
解题思路:
1.按照普通的二叉树处理
递归法:
//本题直接就是求有多少个节点,无脑存进结果变量就行了。
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
res := 1
if root.Right != nil {
res += countNodes(root.Right)
}
if root.Left != nil {
res += countNodes(root.Left)
}
return res
}
迭代法:
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
var res int
var query []*TreeNode
query = append(query,root)
for len(query) > 0 {
len:=len(query)
res += len
for len > 0 {
len --
node:= query[0]
query = query[1:]
if node.Left != nil {
query = append(query,node.Left)
}
if node.Right != nil {
query = append(query,node.Right)
}
}
}
return res
}
2.利用完全二叉树的性质求解
递归法
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
leftH, rightH := 0, 0
leftNode := root.Left
rightNode := root.Right
for leftNode != nil {
leftNode = leftNode.Left
leftH++
}
for rightNode != nil {
rightNode = rightNode.Right
rightH++
}
if leftH == rightH { //左右子树的遍历深度相等,说明是满二叉树,
return (2 << leftH) - 1 //注意(2<<1) 相当于2^2,返回满足满二叉树的子树节点数量
}
return countNodes(root.Left) + countNodes(root.Right) + 1
}
迭代法:
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
q := list.New()
q.PushBack(root)
res := 0
for q.Len() > 0 {
n := q.Len()
for i := 0; i < n; i++ {
node := q.Remove(q.Front()).(*TreeNode)
if node.Left != nil {
q.PushBack(node.Left)
}
if node.Right != nil {
q.PushBack(node.Right)
}
res++
}
}
return res
}

浙公网安备 33010602011771号