树的题目太多了,先总结一下树的遍历方式。
按照根节点的遍历顺序。可以分为前序、中序、后序。
前序遍历,即根–>左–>右的顺序。
中序遍历,左–>根–>右。
后续遍历,左–>右–>根。
用递归实现非常简单:
下面是一个前序遍历,核心部分preorder
实现了前序遍历。
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def preorder(root):
nonlocal res
res.append(root.val)
if root.left: preorder(root.left)
if root.right: preorder(root.right)
if not root: return []
res = []
preorder(root)
return res
只要改一下访问顺序,就得到中序遍历:
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def inorder(root):
nonlocal res
if root.left: inorder(root.left)
res.append(root.val)
if root.right: inorder(root.right)
if not root: return []
res = []
inorder(root)
return res
同样可以得到后序遍历:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def postorder(root):
nonlocal res
if root.left: postorder(root.left)
if root.right: postorder(root.right)
res.append(root.val)
if not root: return []
res = []
postorder(root)
return res
除了这3种遍历,还有一种层序遍历:每次遍历访问一层节点。
可以用队列来实现:
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
queue = [root]
res = []
while queue:
sub_list = []
for i in range(len(queue)):
t = queue.pop(0)
sub_list.append(t.val)
if t.left:
queue.append(t.left)
if t.right:
queue.append(t.right)
res.append(sub_list)
return res
剩下的和树相关的题,大多可以用递归实现。(因为树就是一种递归结构)
有很多与二叉搜索树有关。二叉搜索树(BST)是一种特殊的二叉树,也叫二叉排序树,满足左<根<右
的特点。处理BST时要利用这个性质。
二叉搜索树(BST),它或者是一棵空树,或者是具有下列性质的 二叉树 : 若它的左子树不空,则左子树上所有结点的值均小于它的 根结点 的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为 二叉排序树 。