leetcode102.二叉树的层次遍历、lc107.二叉树的层次遍历 II、lc111.二叉树的最小深度、lc559.N叉树的最大深度、lc199.二叉树的右视图

目录

 

题目一:leetcode102.二叉树的层次遍历

1.题目描述

2.解题思路

3.代码实现

题目二:leetcode107.二叉树的层次遍历 II

1.题目描述

2.解题思路

3.代码实现

题目三:leetcode111.二叉树的最小深度

1.题目描述

2.解题思路

3.代码实现

题目四:leetcode559.N叉树的最大深度

1.题目描述

2.解题思路

3.代码实现

题目五:leetcode199.二叉树的右视图

1.题目描述

2.解题思路

3.代码实现


题目一:leetcode102.二叉树的层次遍历

1.题目描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

2.解题思路

方案一:利用队列层次遍历,每次遍历出队列表中的每一个节点,将这一整层的所有节点的左右节点作为下一层存入队列中。

方案二:还是利用队列层次遍历

现在需要2个变量,一个保存当前行的最右设为last,一个保存下一行的最右nlast

last刚开始为root,当前行即第一行,第一行最右即root

当访问cur时,把它加入tmp数组中,当访问cur的左右时,将左右节点加入队列不断更新nlast,从而保存下一行的最右节点

当访问到cur==last时,将这一行的结果tmp加入res中,并清空tmp:tmp = [ ],且此时nlast必定已经迭代到下一行的最右了,所以在把nlast赋给last,进入下一行的访问。

3.代码实现

方案一:

# 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):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        q=[]
        q.append([root])
        res=[]
        while q:
            l=q.pop(-1)
            if not l:
                break
            ll=[]
            for i in l:
                ll.append(i.val)
            res.append(ll)
            tmp=[]
            for root in l:
                if root.left:
                    tmp.append(root.left)
                if root.right:
                    tmp.append(root.right)
            q.append(tmp)
        return res

方案二:

# 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):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        res = []
        last = root
        nlast = root
        que=[]
        que.append(root)
        tmp=[]
        while que:
            t = que.pop(0)
            tmp.append(t.val)
            if t.left:
                que.append(t.left)
                nlast = t.left
            if t.right:
                que.append(t.right)
                nlast = t.right
            if t == last:
                res.append(tmp)
                tmp=[]
                last = nlast
        return res

题目二:leetcode107.二叉树的层次遍历 II

1.题目描述

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其自底向上的层次遍历为:

[
  [15,7],
  [9,20],
  [3]
]

2.解题思路

把上一题的结果list反向即可

3.代码实现

# 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):
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        res = []
        last = root
        nlast = root
        que=[]
        que.append(root)
        tmp=[]
        while que:
            t = que.pop(0)
            tmp.append(t.val)
            if t.left:
                que.append(t.left)
                nlast = t.left
            if t.right:
                que.append(t.right)
                nlast = t.right
            if t == last:
                res.append(tmp)
                tmp=[]
                last = nlast
        return res[::-1]

题目三:leetcode111.二叉树的最小深度

1.题目描述

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最小深度  2.

2.解题思路

层次遍历,但是队列中存入的是当前节点和其高度,出队时,第一个不包含叶子节点的节点的高度即为二叉树的最小高度。

3.代码实现

# 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):
    def minDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        last = root
        nlast = root
        que=[]
        level = 1
        que.append((root,level))
        while que:
            t,level = que.pop(0)
            if not t.left and not t.right:
                return level
            level+=1
            if t.left:
                que.append((t.left, level))
                nlast = t.left
            if t.right:
                que.append((t.right, level))
                nlast = t.right
            if t == last:
                last = nlast

题目四:leetcode559.N叉树的最大深度

1.题目描述

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

例如,给定一个 3叉树 :

我们应返回其最大深度,3。

说明:

树的深度不会超过 1000。
树的节点总不会超过 5000。

2.解题思路

和上面的题思路一样,层次遍历,最后出队的节点的level是这棵树的最大高度

3.代码实现

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Node
        :rtype: int
        """
        if not root:
            return 0
        que=[]
        level = 1
        que.append((root,level))
        while que:
            t,level = que.pop(0)
            if t.children:
                level+=1
            for child in t.children:
                 que.append((child,level))
        return level

 

题目五:leetcode199.二叉树的右视图

1.题目描述

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

2.解题思路

使用层序遍历,并只保留每层最后一个节点的值

参考题目二

3.代码实现

# 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):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []
        res = []
        # 上一行最后一个节点
        last = root
        # 当前行最后一个节点
        nlast = root
        que=[]
        que.append(root)
        while que:
            t = que.pop(0)
            if t.left:
                que.append(t.left)
                nlast = t.left
            if t.right:
                que.append(t.right)
                nlast = t.right
            if t == last:
                # 把上一行的最后一个节点加入进来
                res.append(t.val)
                last = nlast
        return res

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值