请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
数据范围: 
要求: 空间复杂度
,时间复杂度 )
要求: 空间复杂度
如输入[1,2,4,5,3],[4,2,5,1,3]时,通过前序遍历的结果[1,2,4,5,3]和中序遍历的结果[4,2,5,1,3]可重建出以下二叉树:
所以对应的输出为[1,3,5]。
[1,2,4,5,3],[4,2,5,1,3]
[1,3,5]
二叉树每个节点的值在区间[1,10000]内,且保证每个节点的值互不相同。
import collections # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 求二叉树的右视图 # @param preOrder int整型一维数组 先序遍历 # @param inOrder int整型一维数组 中序遍历 # @return int整型一维数组 # class Solution: def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: # write code here def build_tree(preOrder, inOrder)->TreeNode: if not preOrder: return None root_val = preOrder[0] root = TreeNode(root_val) separator_idx = inOrder.index(root_val) in_left = inOrder[: separator_idx] in_right = inOrder[separator_idx + 1:] pre_left = preOrder[1: 1+len(in_left)] pre_right = preOrder[1+len(in_left):] root.left = build_tree(pre_left, in_left) root.right = build_tree(pre_right, in_right) return root root = build_tree(preOrder, inOrder) if not root: return None res = [] queue = collections.deque([root]) while queue: level = [] for _ in range(len(queue)): node = queue.popleft() level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level[-1]) return res
# 第一步:根据两种遍历结果,构造出二叉树 # 第二步:层序遍历二叉树,记录每一层最右边的节点值 from collections import deque class Solution: def createTree(self, preOrder: List[int], inOrder: List[int]) ->TreeNode: if len(inOrder) == 0: return None root = TreeNode(preOrder[0]) pos = inOrder.index(preOrder[0]) root.left = self.createTree(preOrder[1:pos+1], inOrder[0:pos]) root.right = self.createTree(preOrder[pos+1:], inOrder[pos+1:]) return root def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: root = self.createTree(preOrder, inOrder) result = [] if not root: return result queue = deque([root]) while queue: floor_node_number = len(queue) floor_values = [] for i in range(floor_node_number): node = queue.popleft() floor_values.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(floor_values[-1]) return result
class Solution: xl = [] flag = [] def hf(self, preOrder: List[int], inOrder: List[int]): if not preOrder: return None root = TreeNode(preOrder[0]) i = inOrder.index(preOrder[0]) root.left = self.hf(preOrder[1:i+1],inOrder[:i]) root.right = self.hf(preOrder[i+1:],inOrder[i+1:]) return root def result(self, root, d): if root == None: return if d not in self.flag: self.xl.append(root.val) self.flag.append(d) self.result(root.right,d+1) self.result(root.left, d+1) return def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: # write code here root = self.hf(preOrder,inOrder) d = 1 self.result(root, d) return self.xl
class Solution: def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: if not preOrder: return [] res = [preOrder[0]] index = inOrder.index(preOrder[0]) # 左子树的右视图 left = self.solve(preOrder[1:index+1], inOrder[:index]) # 右子树的右视图 right = self.solve(preOrder[index+1:], inOrder[index+1:]) # 优先取右子树,剩余取左子树 return res + right + left[len(right):]
from collections import deque
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]:
val2idx = {}
for i in range(len(inOrder)):
val2idx[inOrder[i]] = i
def dfs(root_idx, left, right):
if left > right:
return None
# 在 inorder 中的索引
index = val2idx[preOrder[root_idx]]
root = TreeNode(inOrder[index])
root.left = dfs(root_idx+1, left, index-1)
root.right = dfs(root_idx-left+index+1, index+1, right)
return root
# 构建
root = dfs(0, 0, len(inOrder)-1)
# BFS
res = []
if not root:
return res
q = deque([root])
while q:
n = len(q)
res.append(q[0].val)
for _ in range(n):
cur = q.popleft()
if cur.right:
q.append(cur.right)
if cur.left:
q.append(cur.left)
return res
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 求二叉树的右视图 # @param preOrder int整型一维数组 先序遍历 # @param inOrder int整型一维数组 中序遍历 # @return int整型一维数组 from typing import List class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: # write code here # 构建二叉树 root = self.buildTree(preOrder, inOrder) # 打印二叉树的右视图 return self.rightSideView(root) def buildTree(self, preOrder: List[int], inOrder: List[int]) -> TreeNode: if not preOrder&nbs***bsp;not inOrder: return None # 根节点的值为前序遍历的第一个元素 root_val = preOrder[0] root = TreeNode(root_val) # 在中序遍历中找到根节点的位置 root_index = inOrder.index(root_val) # 构建左子树 left_preOrder = preOrder[1:root_index+1] left_inOrder = inOrder[:root_index] root.left = self.buildTree(left_preOrder, left_inOrder) # 构建右子树 right_preOrder = preOrder[root_index+1:] right_inOrder = inOrder[root_index+1:] root.right = self.buildTree(right_preOrder, right_inOrder) return root def rightSideView(self, root: TreeNode) -> List[int]: if not root: return [] result = [] queue = [root] while queue: level_size = len(queue) # 遍历当前层级的节点 for i in range(level_size): node = queue.pop(0) # 记录最右边的节点值 if i == level_size - 1: result.append(node.val) # 将下一层级的节点加入队列 if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result
class Solution: def solve(self , preOrder: List[int], inOrder: List[int]) -> List[int]: # write code here if (len(preOrder) == 0): return [] for i in range(len(inOrder)): if (inOrder[i] == preOrder[0]): tmp1 = self.solve(preOrder[1:i+1], inOrder[0:i]) tmp2 = self.solve(preOrder[i+1:], inOrder[i+1:]) res_tmp = [] if (len(tmp1) <= len(tmp2)): res_tmp = tmp2 else: res_tmp = tmp2 + tmp1[len(tmp2):] return [preOrder[0]] + res_tmp
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 求二叉树的右视图 # @param xianxu int整型一维数组 先序遍历 # @param zhongxu int整型一维数组 中序遍历 # @return int整型一维数组 # class Solution: def recure(self, pre: List[int], vin: List[int], start: int, end: int) -> TreeNode: if start == end: return None mid, idx = -1, start while mid == -1: for i in range(start, end): if vin[i] == pre[idx]: mid = i idx = idx + 1 root = TreeNode(vin[mid]) left = self.recure(pre[1:], vin, start, mid) right = self.recure(pre, vin, mid + 1, end) root.left = left root.right = right return root def solve(self , xianxu: List[int], zhongxu: List[int]) -> List[int]: node = self.recure(xianxu, zhongxu, 0, len(zhongxu)) tmp = [node] ret = [] next = [] while tmp: cur = tmp.pop(0) left, right = cur.left, cur.right if left: next.append(left) if right: next.append(right) if not tmp: ret.append(cur.val) tmp = next next = [] return ret
先把树构建出来,在通过队列取出每层的最后一个节点的值
时间复杂度:O(n) 空间复杂度:O(n)
class Solution:
def tree(self, pre, vin):
if not pre:
return None
root = TreeNode(pre[0])
tem = vin.index(pre[0])
root.left = self.tree(pre[1:tem+1], vin[:tem])
root.right = self.tree(pre[tem+1:], vin[tem+1:])
return root
def solve(self , pre: List[int], vin: List[int]) -> List[int]:
res = []
root = self.tree(pre, vin)
q = [root]
while q:
n = len(q)
for i in range(n):
cur = q.pop(0)
if i == n-1:
res.append(cur.val)
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
return res