二叉树
深度优先遍历
L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则先(根)序遍历二叉树的顺序是DLR,中(根)序遍历二叉树的顺序是LDR,后(根)序遍历二叉树的顺序是LRD。还有按层遍历二叉树。这些方法的时间复杂度都是,
为结点个数。
前序遍历( DLR ):
def preorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []return ([root.val] # 中+ self.preorderTraversal(root.left) # 左+ self.preorderTraversal(root.right) # 右)
中序遍历( LDR ):
def inorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []return (self.inorderTraversal(root.left) # 左+ [root.val] # 中+ self.inorderTraversal(root.right) # 右)
后续遍历( LRD ):
def postorderTraversal(self, root: TreeNode) -> List[int]:if not root:return []return (self.postorderTraversal(root.left) # 左+ self.postorderTraversal(root.right) # 右+ [root.val] # 中)
广度优先遍历
和深度优先遍历不同,广度优先遍历会先访问离根节点最近的节点。二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。
def levelOrder(self, root: TreeNode) -> List[List[int]]:if not root:return []res, queue = [], [root]while queue:tmp, values = [], []for node in queue:values.append(node.val)if node.left:tmp.append(node.left)if node.right:tmp.append(node.right)queue = tmpres.append(values)return res
二叉搜索数
二叉搜索树(英语:Binary Search Tree),也称为二叉查找树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
