0222.-完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 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) 的简单解决方案。你可以设计一个更快的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes

python

# 0222.完全二叉树的节点个数
class Solution:
    # 递归法
    def countNodes(self, root: TreeNode) -> int:
        def getNodesNum(node):
            if not node:
                return 0
            leftNum = getNodesNum(node.left)
            rightNum = getNodesNum(node.right)
            nodesNum = leftNum + rightNum + 1
            return nodesNum
        return getNodesNum(root)

    # 迭代法-层序遍历
    def countNodes1(self, root: TreeNode) -> int:
        from collections import deque
        queue = deque()
        if root:
            queue.append(root)
        nums = 0
        while queue:
            size = len(queue)
            for i in range(size):
                node = queue.popleft()
                nums += 1
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return nums

    # 递归法-完全二叉树版本
    def countNodes2(self, root: TreeNode) -> int:
        if not root:
            return 0
        left = root.left
        right = root.right
        # 左右子树高度初始化为0,
        leftHeight = 0
        rightHeight = 0
        # 左子树深度
        while left:
            left = left.left
            leftHeight += 1
        # 右子树深度
        while right:
            right = right.right
            rightHeight += 1
        if leftHeight == rightHeight:
            return (2 << leftHeight)-1 # 2<<1 = 2^2 = 4, 非空时,height=1
        return self.countNodes2(root.left) + self.countNodes2(root.right) + 1


golang

package binaryTree

import "container/list"

// 迭代遍历
func countNodes1(root *TreeNode) int {
	if root == nil { // 空时返回
		return 0
	}
	nums := 1
	queue := list.New() // 队列控制层序遍历
	queue.PushBack(root)
	for queue.Len() > 0 {
		length := queue.Len()
		for i:=0;i<length;i++ { // 遍历当层的节点
			node := queue.Remove(queue.Front()).(*TreeNode) // 当次节点
			nums++
			if node.Left != nil { // 节点的左节点入队
				queue.PushBack(node.Left)
			}
			if node.Right != nil { // 节点的右节点入队
				queue.PushBack(node.Right)
			}
		}
	}
	return nums
}

// 递归-一般二叉树
func countNodes2(root *TreeNode) int {
	if root == nil {
		return 0
	}
	res := 1
	if root.Right != nil {
		res += countNodes2(root.Right)
	}
	if root.Left != nil {
		res += countNodes2(root.Left)
	}
	return res
}

// 递归-完全二叉树
func countNodes3(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
	}
	return countNodes3(root.Left) + countNodes3(root.Right) + 1
}


posted on 2021-11-14 21:44  进击的davis  阅读(70)  评论(0编辑  收藏  举报

导航