首页 > 其他分享 >数据结构 树(第10-14天)

数据结构 树(第10-14天)

时间:2022-10-29 11:36:53浏览次数:53  
标签:10 遍历 return 14 res right 数据结构 root left


树的题目太多了,先总结一下树的遍历方式。
按照根节点的遍历顺序。可以分为前序、中序、后序。
前序遍历,即根–>左–>右的顺序。
中序遍历,左–>根–>右。
后续遍历,左–>右–>根。

用递归实现非常简单:
下面是一个前序遍历,核心部分​​​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),它或者是一棵空树,或者是具有下列性质的 二叉树 : 若它的左子树不空,则左子树上所有结点的值均小于它的 根结点 的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为 二叉排序树 。


标签:10,遍历,return,14,res,right,数据结构,root,left
From: https://blog.51cto.com/pigeon/5805833

相关文章