0.总结



1.​​题目​​

根据先序遍历和中序遍历构建一棵二叉树。

2.思想

关键代码:
​​​ left_num = bound - in_left # 需要找到左子树上的节点个数 ​​ 因为左子树也是有个数的,所以就要求在传递更新参数的时候,需要把左子树节点个数考虑进去,对于右子树也是同样的道理。

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 buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
root = self.dfs(preorder,inorder,0,len(preorder)-1,0,len(inorder)-1)
return root

def dfs(self,preorder,inorder,pre_left,pre_right,in_left,in_right):
if pre_left > pre_right:
return None
# if pre_left == pre_right: # 只有一个节点,直接返回
# return TreeNode(preorder[pre_left])

# 建树,当前这棵树的根节点
root_val = preorder[pre_left]
cur_root = TreeNode(root_val)

new_pre_left = pre_left + 1
new_pre_right = pre_right

# 找到左右两边儿,再分别建树
bound = inorder.index(root_val)
new_in_right = bound - 1

# 需要找到左子树上的节点个数
left_num = bound - in_left

# 这里传入的仍然是一个完整的数组
# 建左子树
left = self.dfs(preorder,inorder,pre_left+1,pre_left+left_num,in_left,bound-1)

# 建右子树
right = self.dfs(preorder,inorder,pre_left+left_num+1,pre_right,bound+1,in_right)

cur_root.left = left
cur_root.right = right
return cur_root