算法记录 | Day14二叉树Ⅱ

59 阅读2分钟

算法记录 | Day14二叉树Ⅱ

队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

LeetCode 102-层序遍历

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

题目链接:leetcode.cn/problems/bi…

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
解题思路
  • 队列
# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        res = []
        if not root:
            return res
        
        from collections import deque
        que = deque([root])
        
        while que:
            length = len(que)
            ans = []
            for _ in range(length):
                cur = que.popleft()
                ans.append(cur.val)
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            res.append(ans)

        return res
难点
  • 将根节点加入队列是将所有节点加入到队列中?

LeetCode 226-翻转二叉树

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

题目链接:leetcode.cn/problems/in…

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
解题思路
  • 递归解法
class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root
        # 交换左右
        root.left, root.right = root.right, root.left
        self.invertTree(root.left)
        self.invertTree(root.right)
        return root

注意


LeetCode 101-对称二叉树Ⅱ

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

题目链接:leetcode.cn/problems/sy…

输入:root = [1,2,2,3,4,4,3]
输出:true
解题思路
  • 递归
# 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.compare(root.left, root.right)
    def compare(self, left, right):
        if left==None and right!=None:
            return False
        elif left!=None and right==None:
            return False
        elif left==None and right==None:
            return True
        elif left.val != right.val:
            return False
        
        outside = self.compare(left.left, right.right)
        inside = self.compare(left.right, right.left)
        return outside and inside
难点
  • 还可以使用栈与队列来解答