数据结构算法刷题(26)层序遍历二叉树

文章介绍了使用deque进行二叉树的层序遍历,包括普通遍历、锯齿形遍历、寻找底部左侧值、计算最大深度和最小深度,以及获取右侧视图的方法。通过层序遍历,结合不同条件对子节点的处理,实现各种特定的树结构信息提取。

思路:维护一个deque,首先把节点入队,然后从队头pop出来node,将node的val存入当层的数组中,如果node的左子树在,就左子树入队,如果node的右子树在,就右子树入队。小循环结束后要把当层的val数组清空,当队空时跳出循环。

class Solution:

    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:

        if root is None:

            return []

        ans = []

        q = deque([root])

        vals = []

        while q:

            vals = [] #小循环结束后清空vals

            for _ in range(len(q)):

                node = q.popleft() #先拿到该值

                vals.append(node.val)

                if node.left : q.append(node.left)

                if node.right : q.append(node.right)

            ans.append(vals)

        return ans

 

思路:在偶数层反转答案就行。

class Solution:

    def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:

        if root is None:

            return []

        ans = []

        q = deque([root])

        i = 1

        while q:

            vals = []

            l = len(q)

            for _ in range(l):

                node = q.popleft()

                vals.append(node.val)

                if node.left: q.append(node.left)

                if node.right: q.append(node.right)

            if i % 2:

                ans.append(vals)

            else: ans.append(vals[::-1])

            i += 1

        return ans

思路一:层序遍历,然后返回ans[-1][0]

class Solution:

    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:

        q = deque([root])

        ans = []

        while q:

            vals = []

            for _ in range(len(q)):

                node = q.popleft()

                vals.append(node.val)

                if node.left: q.append(node.left)

                if node.right:q.append(node.right)

            ans.append(vals)

        return ans[-1][0]

 思路二:让右子树先入队,再入队左子树,最后一个节点就是答案

class Solution:

    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:

        q = deque([root])

        while q:

            node = q.popleft()

            if node.right:q.append(node.right)

            if node.left:q.append(node.left)

        return node.val

思路:层序遍历,每层将ans+1

class Solution:

    def maxDepth(self, root: Optional[TreeNode]) -> int:

        ans = 0

        if root is None:

            return 0

        q = deque([root])

        while q:

            for _ in range(len(q)):

                node = q.popleft()

                if node.left:q.append(node.left)

                if node.right:q.append(node.right)

            ans += 1

        return ans

 

思路:层序遍历二叉树,第一次遇到某个节点没有左右子树的时候,就return出当前节点的层数。

class Solution:

    def minDepth(self, root: Optional[TreeNode]) -> int:

        ans = 1

        if root is None:

            return 0

        q = deque([root])

        while q:

            for _ in range(len(q)):

                node = q.popleft()

                if node.left:q.append(node.left)

                if node.right:q.append(node.right)

                if not node.left and not node.right:

                    return ans

            ans += 1

思路:返回层序遍历每一层的最后一个值。

class Solution:

    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:

        ans = []

        if root is None:

            return []

        q = deque([root])

        while q:

            vals = []

            for _ in range(len(q)):

                node = q.popleft()

                if node.left:q.append(node.left)

                if node.right:q.append(node.right)

                vals.append(node.val)

            ans.append(vals[-1])

        return ans

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值