318 树的先序遍历 #
- 问题描述
- 先序遍历
- 实现
问题描述 #
如果要实现遍历一棵树的所有结点,有两种方式,一种是深度优点,一种是广度优先。深度优先是按照递归的方式遍历,而广度优先则是按照层级进行遍历
先序遍历 #
对于任意一个树,只存在根结点、左子树和右子树。所谓先序遍历即是先遍历根结点,再遍历左子树,再遍历右子树,遍历子树的时候也按照这种模式进行。
中序遍历和后序遍历也很简单,先遍历左子树,再遍历根结点,再遍历右子树,后序遍历则是按照左子树、右子树、根结点的顺序遍历。
中序遍历和后序遍历也很简单,先遍历左子树,再遍历根结点,再遍历右子树,后序遍历则是按照左子树、右子树、根结点的顺序遍历。
以下图为例来说明先序遍历的过程:
- 首先遍历根结点,得到1
- 然后遍历左子树,遍历左子树时也先遍历根结点,得到左子树的根结点2
- 左子树的左子树只有一个结点4,左子树的右子树为5
- 遍历右子树,右子树只有一个结点为3
- 最终的结果是1,2,4,5,3
实现 #
下面是采用递归方式实现的遍历:
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def preorderTraversal(root): def preorder(root): if not root: return res.append(root.val) preorder(root.left) preorder(root.right) res = list() preorder(root) return res tree = TreeNode(1, TreeNode(2), TreeNode(3)) tree.left.left = TreeNode(4) tree.left.right = TreeNode(5) print(preorderTraversal(tree))
小结 #
习题 #
- 尝试实现中序遍历
- 尝试实现后序遍历