基本概念
树
在了解二叉树之前,我们需要知道什么是树这个数据结构。
一颗树上面有很多树枝,而树枝上面又有很多树枝,这些树枝是可以扩展的,但它终究是有限的。因为长到一定程度,它就会停止分支。因此对于我来说树是 由根节点自上向下自左向右地扩展分支的有限数据集(根节点可以是不固定的) 。
度 高度 深度 层次
节点的度:一个节点含有的子节点的个数;
度为零的节点称为叶节点或终端节点;
树的度:一棵树中,最大的节点的度;
节点的层次:从最顶部根开始定义起,最顶部根为第1层,最顶部根的子节点为第2层,以此类推;
树的高度或深度:树中最大的节点的层次,高度从下往上,深度从上往下;
二叉树
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
对于我来说每个节点不超过两个分支的树称为二叉树
树的遍历方式:前序
中序
后序
层序
二叉树的分类:满二叉树、完全二叉树、排序二叉树
、平衡二叉树
、哈夫曼树
前序遍历
根 -> 左 -> 右
前序遍历首先访问最顶部根节点,然后遍历最顶部根节点的左子树,最后遍历最顶部根节点的右子树。
以上面二叉树的图片为例前序遍历结果为:FBADCEGIH
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if root == None: return []
return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
中序遍历
左 -> 根 -> 右
中序遍历是先遍历最顶部根节点的左子树,然后访问最顶部根节点,最后遍历最顶部根节点的右子树。
以上面二叉树的图片为例中序遍历结果为:ABCDFGHI
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if root == None: return []
return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
后序遍历
左 -> 右 -> 根
后序遍历是先遍历最顶部根节点的左子树,然后遍历最顶部根节点的右子树,最后访问最顶部根节点。
以上面二叉树的图片为例后序遍历结果为:ACEDBHIGF
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if root == None: return []
return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]
层序遍历
自上而下自左向右,逐层遍历树
以上面二叉树的图片为例后序遍历结果为:FBGADICEH
力扣题目:102. 二叉树的层序遍历
广度优先搜索(BFS)
排序二叉树
二叉树中任意节点的左子节点小于该节点,右子节点大于该节点。
力扣题目:剑指 Offer II 056. 二叉搜索树中两个节点之和
平衡二叉树
二叉树中任意节点的左右两个子树的高度或深度之差的绝对值不超过 1 。
力扣题目:110. 平衡二叉树