求完全二叉樹節(jié)點(diǎn)個(gè)數(shù)
原題地址https://leetcode.com/problems/count-complete-tree-nodes/description/
思路:先算出樹的高度level伴网,找尾節(jié)點(diǎn),看下結(jié)尾排列英上,看下h = 3最后一排的排列,0代表向左子樹搜索,1代表向右子樹搜索慎陵,可以用bit特位表示讥蟆,可以用二分查找法搜索拒垃,每一次從根節(jié)點(diǎn)向葉節(jié)點(diǎn)查找
#(0,0,0),(0,0,1)(0,1,0)(0,1,1)(1,0,0)(1,0,1)(1,1,0)(1,1,1)其實(shí)是
0窍侧,1县踢,2,3伟件,4硼啤,5,6斧账,7
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
# 先算數(shù)的深度
def findlevel(self, root):
if root:
return 1+self.findlevel(root.left)
else:
return 0
'''step就是用1代表(0,0,1),3'''
def findendNode(self, root, step, level):
#print step,level
temp = root
for i in range(level):
if ((step&(2**(level-1-i))) >> (level-1-i)) == 0:
#print 'xxx'
temp = temp.left
else:
temp = temp.right
if temp:
return True
else:
return False
'''
def findendNode(self, root, step, level):
temp = root
lr = list(bin(step))[2:]
#print 'lr', lr, 'level', level
lrlen = len(lr)
# 左子樹
for i in range(level-lrlen):
temp = temp.left
for i in range(lrlen):
if lr[i] == '0':
temp = temp.left
else:
temp = temp.right
if temp:
return True
else:
return False
'''
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
level=self.findlevel(root)-1
if level == 0:
return 1
endend = 2**level
s = endend - 1
# 找出深度后呢谴返,找出結(jié)尾煞肾,看下結(jié)尾排列,看下h = 3最后一排的排列,0代表向左子樹搜索嗓袱,1代表向右子樹搜索籍救,可以用bit特 # 位表示,可以用二分查找法
#(0,0,0),(0,0,1)(0,1,0)(0,1,1)(1,0,0)(1,0,1)(1,1,0)(1,1,1)其實(shí)就是0渠抹,1蝙昙,2,3逼肯,4耸黑,5桃煎,6篮幢,7
start = 0
end = endend-1
while True:
# 從中間找
temp = (end+start)/2
if not self.findendNode(root, temp, level):
# 如果是false,設(shè)置為end
end = temp
else:
# 如果是true为迈,設(shè)置為起點(diǎn)
start = temp
if end-start == 1:
if end == endend-1:
if self.findendNode(root, end, level):
s += endend
return s
else:
s+= end
return s
else:
s += end
return s