验证二叉树:双端队列

在这里插入图片描述
在这里插入图片描述
要读懂题目:这里说的是节点上的数字i是寻找孩子列表中第i个位置的数字,并根据该数字寻找下一个孩子的位置。

python中也有对应的数据结构代码:
双端队列

import collections
d = collections.deque([])
d.append('a') # 在最右边添加一个元素,此时 d=deque('a')
d.appendleft('b') # 在最左边添加一个元素,此时 d=deque(['b', 'a'])
d.extend(['c','d']) # 在最右边添加所有元素,此时 d=deque(['b', 'a', 'c', 'd'])
d.extendleft(['e','f']) # 在最左边添加所有元素,此时 d=deque(['f', 'e', 'b', 'a', 'c', 'd'])
d.pop() # 将最右边的元素取出,返回 'd',此时 d=deque(['f', 'e', 'b', 'a', 'c'])
d.popleft() # 将最左边的元素取出,返回 'f',此时 d=deque(['e', 'b', 'a', 'c'])
d.rotate(-2) # 向左旋转两个位置(正数则向右旋转),此时 d=deque(['a', 'c', 'e', 'b'])
d.count('a') # 队列中'a'的个数,返回 1
d.remove('c') # 从队列中将'c'删除,此时 d=deque(['a', 'e', 'b'])
d.reverse() # 将队列倒序,此时 d=deque(['b', 'e', 'a'])
#可以指定队列的长度,如果添加的元素超过指定长度,则原元素会被挤出。
e=collections.deque(maxlen=5)
e.extend([1,2,3,4,5])
e.append("a")
print(e)
#deque([2, 3, 4, 5, 'a'], maxlen=5)
原文链接:https://blog.csdn.net/weixin_44056331/article/details/90261974

整体思路:
有效二叉树:所有的节点一次遍历,遍历的次数为1
1)如果下标在leftChild以及rightChild中出现次数大于1次,可能出现环,则返回False
2)如果下标在leftChild以及rightChild中均未出现的头结点个数大于1,肯定不是一棵树,则返回False
3)如果只存在一个头结,则该头节点一定未出现在leftChild以及rightChild中,利用集合找到
4)利用双端队列,弹出当前父节点popleft(),若子节点不为空,则将其压入队列,append()
5) 直到队列元素全部弹出,查看遍历列表的长度是否为n

# 下标出现两次就不是
        s = set(leftChild)&set(rightChild)-set({-1})
        if s:
            return False
        # 下标少了两个,两个头也不是
        s = set(leftChild)|set(rightChild)
        s.discard(-1)
        if len(s)<n-1 or len(s)==n:
            return False
        m=0
        l=set([i for i in range(n)])
        s=l-s
        l_new=list(s)
        # 双端队列
        q = collections.deque(l_new)
        # 利用层遍历:
        while len(q)>0:
            cur=q.popleft()
            #从左端弹出下标
            # 左孩子不为空
            if  leftChild[cur]!=-1:
                if leftChild[cur] in l_new:
                    return False
                l_new.append(leftChild[cur])
                q.append(leftChild[cur])# 把next的下标压入双端队列
                    
            # 右孩子不为空
            if  rightChild[cur]!=-1:
                if rightChild[cur] in l_new:
                    return False
                l_new.append(rightChild[cur])
                q.append(rightChild[cur])# 把next的下标压入双端队列

        return len(l_new)==n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值