leetcode222

求完全二叉樹節(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容