求顺序存储二叉树高度

之前都是链式存储二叉树,今天写了一个顺序存储的,虽然比较简单,就当回忆层次遍历和队列了

# '#'号代表空
#*******************************************#
#递归表示
def TreeHeight(T,i):
    if i>len(T)-1:
        return 0;
    LH=TreeHeight(T,2*i+1)
    RH=TreeHeight(T,2*i+2)
    return max(LH,RH)+1

tree=[1,2,3,4,'#','#',5]
height=TreeHeight(tree,0)
print(height)#打印

#*******************************************#
#非递归表示

class LinkLnode:
    def __init__(self):
        self.data = None
        self.next = None

class LinkQueue:
    def __init__(self):
        HeadNode =LinkLnode()
        self.front = HeadNode 
        self.rear = HeadNode
    def IsEmpty(self):
        if (self.front == self.rear):
            return True
        else:
            return False    
    def EnQueue(self,value):
        Lnode = LinkLnode()
        Lnode.data = value
        Lnode.next = None
        self.rear.next = Lnode
        self.rear = Lnode
    def DeQueue(self):
        if (self.front == self.rear):
            return False
        p = self.front.next;
        value = p.data;
        self.front.next = p.next
        if (p == self.rear):
            self.rear = self.front;
        return value
    def GetTop(self):
        if (self.front == self.rear):
            return False
        p = self.front.next;
        return p.data;
    def GetLast(self):
        if (self.front == self.rear):
            return False
        p = self.rear;
        return p.data;
def TreeHeightByQueue(T):
     if len(T)==0:
         return 0
     last=0
     height=0
     queue=LinkQueue()
     #根节点入队
     queue.EnQueue(0)
     while not queue.IsEmpty():
         p=queue.DeQueue()
         #左儿子存在,左儿子入队
         if (2*p+1<=len(T)-1 and T[2*p+1]!='#'):
             queue.EnQueue(2*p+1)
         #右儿子存在,右儿子入队
         if (2*p+2<=len(T)-1 and T[2*p+2]!='#'):
             queue.EnQueue(2*p+2)
         #如果出队的节点是该层最右边的节点,表示该层遍历完毕,高度加一
         if p==last:
             height=height+1
             #last指向该节点的孩子节点
             last=queue.GetLast()
     return height
tree=[1,2,3,4,'#','#',5]
height=TreeHeightByQueue(tree)
print(height)#打印    
#*******************************************#
             

    
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值