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 
}
posted @ 2023-05-16 15:27  小星code  阅读(20)  评论(0)    收藏  举报