层序遍历学好了可以解十道题

本专题来自代码随想录,链接:

代码随想录

学会二叉树的层序遍历,可以一口气打完以下十题(来源:代码随想录):

层序遍历需要用队列来求解,队列也是在广度优先里常用的数据结构.层序遍历最基础的代码如下:

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []##树为空,返回也为空
        que = collections.deque([root])   ##创建队列    
        res = []
        while que:
            level = []   ##创建当前层需要返回的一维数组
            levelsize = len(que)  ##记录当前队列里有几个数,有几个数就在下面的for循环循环几次
            for i in range(levelsize):  ##这个for循环循环一次,遍历完当前层的所有结点
                cur = que.popleft()  ##取出当前结点元素
                level.append(cur.val)  ##把结点元素放入一位数组中
                if cur.left:  ##如果当前结点有左右子结点,就放到队列中
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            res.append(level)##将当前层的一维数组放入res中,res是个二维数组
        return res

如果是自底向上遍历,把结果倒过来就好了,代码如下:

class Solution:
    def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        queue = collections.deque([root])
        res = []
        while queue:
            levelsize = len(queue) 
            for i in range(levelsize):
                cur = queue.popleft()
                level = []
                res.append(cur.val)
                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right) 
        return res[::-1]  

二叉树右视图

如果是只返回最右边结点,在for循环中判断是不是到了最右边结点,如果是,返回即可:

class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        que = collections.deque([root])
        res = []
        while que:
            levelsize = len(que)
            for i in range(levelsize):
                cur = que.popleft()
                if i == levelsize  - 1:
                    res.append(cur.val)
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
        return res

二叉树层平均值

如果是求每一层平均值,在for循环外计算一下就好

class Solution:
    def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
        que = collections.deque([root])
        res = []
        while que:
            levelsize = len(que)
            sum = 0
            for i in range(levelsize):
                cur = que.popleft()
                sum += cur.val
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            res.append(sum/levelsize)
        return res
                

N叉树层序遍历

如果是N叉树,那就把for循环里的判断有没有左右子节点改为for循环,遍历所有子节点,然后加到que里面去:

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root:
            return []
        que = collections.deque([root])
        res = []
        while que:
            level = []
            levelsize = len(que)
            for i in range(levelsize):
                cur = que.popleft()
                level.append(cur.val)
                for child in cur.children:
                    que.append(child)
            res.append(level)
        return res

二叉树每层最大值

如果是求最大值也是修改一下就好

class Solution:
    def largestValues(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        que = collections.deque([root])
        res = []
        while que:
            level = []
            levelsize = len(que)
            for i in range(levelsize):
                cur = que.popleft()
                level.append(cur.val)
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            maxnum = max(level)
            res.append(maxnum)
        return res

填充二叉树同一层右侧结点指针(完全二叉树和非完全二叉树一样)

如果想把同一层的数据当链表一样从左到右串起来,也是在这个基础上改下:

class Solution:
    def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
        if not root:
            return root
        que = collections.deque([root])
        # res = []
        while que:
            levelsize = len(que)
            prev = None #设一个结点,是当前层,且当前结点的前一个结点
            for i in range(levelsize):
                cur = que.popleft()
                if prev:#如果当前层的结点,有前一个结点
                    prev.next = cur #前一个结点的指针指向当前结点
                prev = cur #指完之后记得更新prev的值
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
        return root

如果不是完全二叉树,也没有影响,代码和上面一样.

二叉树最大深度

求二叉树最大深度,可以用层序遍历,记住自己遍历的多少层就行:

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        que = collections.deque([root])
        res = 0
        while que:
            levelsize = len(que)
            for i in range(levelsize):
                cur = que.popleft()
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            res += 1
        return res

二叉树最小深度

求最小深度,多家一个判断是否为叶子节点的代码即可:

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        que = collections.deque([root])
        res = 0
        while que:
            levelsize = len(que)
            for i in range(levelsize):
                cur = que.popleft()
                if not cur.left and not cur.right:#判断是否为叶子节点
                    res += 1
                    return res
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            res += 1
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值