算法记录 | Day14二叉树Ⅱ
队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
LeetCode 102-层序遍历
题目描述:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
输入: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 ,翻转这棵二叉树,并返回其根节点。
输入: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 , 检查它是否轴对称。
输入: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
难点
- 还可以使用栈与队列来解答