常用树定义
-
多叉树:不限制每个结点的子节点数量的树型结构。
-
二叉树:每个结点最多有两个子节点,上面的树型结构就是二叉树。左边的叫左子树,右边的叫右子树。
-
满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。
-
完全二叉树:叶子结点只存在在最后一层或倒数第二层。并且如果最下面一层节点不满,则所有的节点在左边的连续排列,空位都在右边。(理解为两个层级相差为1的满二叉树之间的树,空位都在右边)
-
平衡树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡树有很多常用的使用方法,比如有红黑树、AVL等。
-
二叉搜索树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
-
红黑树:Red-Black Tree(R-B Tree)
-
AVL:加了平衡条件的二叉搜索树,因为平衡后深度更浅,那么搜索的性能更高了。
-
哈夫曼树
二叉树遍历
DFS:深度优先,比如前中后序遍历,需要用到递归
BFS:广度优先,比如层次遍历,需要用到列表(栈或队列),迭代方式实现。
迭代方式需要借助栈,重点考虑入栈、出栈顺序
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
1 前序遍历
递归
def preorder(root):
if not root:return # 处理节点为空
# 操作root.val
preorder(root.left)
preorder(root.right)
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
r = []
if not root:return r
def preorder(root,result):
if not root:return
result.append(root.val)
preorder(root.left,result)
preorder(root.right,result)
preorder