一.题目

leetcode:222

完全二叉树节点个数
用层序遍历可以做,就是套模板,

层序遍历解法

func countNodes(root *TreeNode) int {
    if root==nil{
        return 0
    }
    lis := list.New()
    lis.PushBack(root)
    num := 1
    for lis.Len()>0{
        length := lis.Len()
        for i:=0;i<length;i++{
            node := lis.Remove(lis.Front()).(*TreeNode)
            if node.Left!=nil{
                lis.PushBack(node.Left)
                num++
            }
            if node.Right!=nil{
                lis.PushBack(node.Right)
                num++
            }

        }
    }
    return num
}

递归解法

func countNodes(root *TreeNode) int{
    var traversal func(node *TreeNode)
    num := 0
    traversal = func(node *TreeNode){
        if node==nil{
            return 
        }
        num++
        traversal(node.Left)
        traversal(node.Right)
    }
    traversal(root)
    return num
}

推荐:利用完全二叉树特性的递归解法

有一点不懂的是:为什么countNodes(root.Left)这个递归就可以返回左子树的个数,并没有返回任何值呀?

func countNodes(root *TreeNode) int {
    if root==nil{
        return 0
    }
    lefth, righth := 0,0
    left := root.Left
    right := root.Right
    for left!=nil{
        lefth++
        left = left.Left
    }
    for right!=nil{
        righth++
        right = right.Right
    }
    if righth==lefth{
        // 说明是完全二叉树,根据公式来,计算深度是优化
        return (2<<lefth)-1
    }
    // 不相等,不能优化
    return countNodes(root.Left) + countNodes(root.Right) + 1
}
分类: 算法

浙公网安备33011302000604

辽ICP备20003309号