day15 ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

文章讲述了二叉树的各种遍历方法(层序、层次、前序、中序、后序),以及如何计算二叉树的最大深度、最小深度、翻转树结构以及判断二叉树是否轴对称。同时涉及到了二叉树的特殊问题,如填充下一个右侧节点指针和求解每层的最大值。
摘要由CSDN通过智能技术生成

思考:

1.系统中应该是自带了数组存储二叉树的函数,当测试用例为root = [3,9,20,null,null,15,7]这样的数组时,其实为二叉树,根节点为root,调用root,root.next等即可

2.层序遍历结构都相似:

while myque:
            level=[] #存储每一层的内容
            for _ in range(len(myque)): #每一层进行处理:存进result中本层的值,存进myque中下一层的节点
#2.后面这段固定更新层序
                cur=myque.popleft()
#1.这行根据题目要求在处理层序任务
                level.append(cur.val)
#2.后面这段固定更新层序
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
            result.append(level)

3.二叉树就是在遍历中处理数据,遍历时前、中、后、层次遍历的选取也是有原因的:

前序:

中序:

后序:要处理孩子数据后传给父节点的

层次:一层一层处理

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
#看代码随想录动图很清晰
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root: #注意节点为空的情况 可能会报错Nonetype
            return []
        myque=deque([root]) #模拟双向队列
        result=[] #存储结果
        while myque:
            level=[] #存储每一层的内容
            for _ in range(len(myque)): #每一层进行处理:存进result中本层的值,存进myque中下一层的节点
                cur=myque.popleft()
                level.append(cur.val)
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
            result.append(level)    
        return result


107. 二叉树的层序遍历 II

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution:
    def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root: #注意节点为空的情况 可能会报错Nonetype
            return []
        myque=deque([root]) #模拟双向队列
        result=[] #存储结果
        while myque:
            level=[] #存储每一层的内容
            for _ in range(len(myque)): #每一层进行处理:存进result中本层的值,存进myque中下一层的节点
                cur=myque.popleft()
                level.append(cur.val)
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
            result.append(level)
        result.reverse()    
        return result

199. 二叉树的右视图

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

示例 1:

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

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
from collections import deque
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        if not root:
            return []
        myque=deque([root])
        result=[]
        while myque:
            level=[]
            for _ in range(len(myque)):
                cur=myque.popleft()
                level.append(cur.val)
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
            result.append(level.pop())
        return result

637. 二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
import statistics
class Solution:
    def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
        if not root: #注意节点为空的情况 可能会报错Nonetype
            return []
        myque=deque([root]) #模拟双向队列
        result=[] #存储结果
        while myque:
            level=[] #存储每一层的内容
            for _ in range(len(myque)): #每一层进行处理:存进result中本层的值,存进myque中下一层的节点
                cur=myque.popleft()
                level.append(cur.val)
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
            result.append(statistics.mean(level))   
        return result

429. N 叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""

class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root: #注意节点为空的情况 可能会报错Nonetype
            return []
        myque=deque([root]) #模拟双向队列
        result=[] #存储结果
        while myque:
            level=[] #存储每一层的内容
            for _ in range(len(myque)): #每一层进行处理:存进result中本层的值,存进myque中下一层的节点
                cur=myque.popleft()
                level.append(cur.val)
                for child in cur.children:
                    myque.append(child)
            result.append(level)    
        return result        

515. 在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def largestValues(self, root: Optional[TreeNode]) -> List[int]:
        if not root: #注意节点为空的情况 可能会报错Nonetype
            return []
        myque=deque([root]) #模拟双向队列
        result=[] #存储结果
        while myque:
            level=[] #存储每一层的内容
            for _ in range(len(myque)): #每一层进行处理:存进result中本层的值,存进myque中下一层的节点
                cur=myque.popleft()
                level.append(cur.val)
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
            result.append(max(level))    
        return result

116. 填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

输入:root = []
输出:[]

"""
# Definition for a Node.
class Node:
    def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""

class Solution:
    def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
        if not root: #注意节点为空的情况 可能会报错Nonetype
            return None
        myque=deque([root]) #模拟双向队列
        # result=[] #存储结果
        while myque:
            prev_node=None
            for i in range(len(myque)):
                cur_node=myque.popleft()
                if prev_node: #处理功能
                    prev_node.next=cur_node
                prev_node=cur_node
                if cur_node.left: #更新myque
                    myque.append(cur_node.left)
                if cur_node.right:
                    myque.append(cur_node.right)
        return root        

117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

与上一题一样的答案

104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2
from collections import deque
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        myque=deque([root])
        count=0
        while myque:
            count+=1
            for i in range(len(myque)):
                cur=myque.popleft()
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
        return count

111. 二叉树的最小深度

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

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

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        myque=deque([root])
        count=0
        while myque:
            count+=1
            for i in range(len(myque)):
                cur=myque.popleft()
                if cur.left:
                    myque.append(cur.left)
                if cur.right:
                    myque.append(cur.right)
                if not cur.left and not cur.right:
                    return count
        return count

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        def invert(root):
            if not root: #终止条件是空节点了就不操作了
                return
            #前序遍历
            root.left,root.right=root.right,root.left  #中:在处理交换逻辑
            invert(root.left) #左:处理左
            invert(root.right) #右:处理右
        invert(root)
        return root

 

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        return self.iss(root.left,root.right)

    def iss(self,left,right): #定义比较方法,注意如果是写在类里面的方法要加self调用这个类,如果是写在方法中的方法,则不需要加self
            if not left and right: #四类递归终止条件
                return False
            elif not right and left:
                return False
            elif not right and not left:
                return True
            elif right.val!=left.val:
                return False
            else:                #第五类需要继续递归
                outside=self.iss(left.left,right.right) #左
                inside=self.iss(left.right,right.left) #右
                return outside and inside  #中

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值