一、199. 二叉树的右视图

- 思路:
直接复用层序遍历的代码,然后取每层的最后一个节点
- 代码:
class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
'''
层序遍历取每层的第一个
'''
if not root: return []
res = []
queue = collections.deque()
queue.append(root)
while queue:
tmp_res = []
for _ in range(len(queue)):
node = queue.popleft()
tmp_res.append(node.val)
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
res.append(tmp_res[-1])
return res
二、114. 二叉树展开为链表

- 思路:
直接复用先序遍历,然后遍历结果,依次修改结果就行
- 代码:
class Solution:
def flatten(self, root: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
可以先序遍历节点,将节点放到列表中,然后连接上各节点
"""
def dfs(cur):
if not cur:
return
res.append(cur)
dfs(cur.left)
dfs(cur.right)
res = []
dfs(root)
for idx, n in enumerate(res):
if idx == len(res)-1:
n.left = None
n.right = None
else:
n.left = None
n.right = res[idx+1]
三、105. 从前序与中序遍历序列构造二叉树

- 思路:
根据前中后序任意两个可以重建一颗二叉树,只靠前序和后序不是唯一的。
- 代码:
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
if not preorder:
return None
left_size = inorder.index(preorder[0])
left = self.buildTree(preorder[1: 1 + left_size], inorder[:left_size])
right = self.buildTree(preorder[1 + left_size:], inorder[1 + left_size:])
return TreeNode(preorder[0], left, right)
四、889. 根据前序和后序遍历构造二叉树

class Solution:
def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
if not preorder:
return None
if len(preorder) == 1:
return TreeNode(preorder[0])
left_size = postorder.index(preorder[1]) + 1
left = self.constructFromPrePost(preorder[1: 1 + left_size], postorder[:left_size])
right = self.constructFromPrePost(preorder[1 + left_size:], postorder[left_size: -1])
return TreeNode(preorder[0], left, right)