222.完全二叉树的节点个数

153 阅读1分钟

题目:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
算法:
因为完全二叉树的性质,root节点总有一个子树为完全二叉树。 T(n) = T(n/2) + logn T(n/2)遍历子树为非完全二叉树,每个节点执行logn求height,总共次数为 n/2 + (n/2 -1) + (n/2 - 2) + (n/2 - 4) + (n/2 - 8)... 1=logn T(n) = logn * logn

func countNodes(root *TreeNode) int {
	if root == nil {
		return 0
	}
	lh, rh := 0, 0
	left := root.Left 
	for left != nil {
		lh ++
		left = left.Left
	}
	right := root.Right 
	for right != nil {
		rh ++
		right = right.Right
	}
	if lh == rh {
		// 左右节点高度都是lh,加上根节点高度lh + 1
		return (1 << (lh + 1)) - 1
	}
	return countNodes(root.Left) + countNodes(root.Right) + 1

}