【学习笔记】树、二叉树、二叉搜索树

回顾:
单链表
【学习笔记】树、二叉树、二叉搜索树_第1张图片
查询的 时间复杂度是 O(N) 的
详见

1.树

想象一下链表有多个 next 指针,则就产生了树
【学习笔记】树、二叉树、二叉搜索树_第2张图片

2.二叉树 Binary Tree

树的节点都是只有两个的树称之为二叉树
树和图的区别是: 树没有环,而图是有环的
可以如下这么理解:

  • LinkedList 是特殊化的 Tree
  • Tree 是特殊化的 Graph
    二叉树的遍历方式:
  1. 前序(Pre-Order): 左 右
  2. 中序(In-Order):左
  3. 后序 (Post-Order):左 右
def preorder(self, root):
	if root:
		self.traverse_path.append(root.val)
		self.preorder(root.left)
		self.preorder(root.right)
def inorder(self, root):
	if root:
		self.inorder(root.left)
		self.traverse_path.append(root.val)
		self.inorder(root.right)
def postorder(self, root):
	if root:
		self.postorder(root.left)
		self.postorder(root.right)
		self.traverse_path.append(root.val)

Q:为什么树的搜索是基于递归的?
因为树的本身是没有有效的进行所谓的循环的,所以请
爱上递归,拥抱递归

【学习笔记】树、二叉树、二叉搜索树_第3张图片
【学习笔记】树、二叉树、二叉搜索树_第4张图片

3.二叉搜索树 Binary Search Tree

二叉搜索树,也称二叉有序树(Ordered Binary Tree)、排序二叉树(Sorted Binary Tree),是指一颗树或者具有下列性质的二叉树:

  1. 左子树上所有节点的值均小于它的根节点的值;
  2. 右子树上所有节点的值均大于它的根节点的值
  3. 以此类推:左、右子树也称为二分查找树,(这就是 重复性! )
    为什么称为二分查找树?因为根据二叉搜索树的定义,左 > 根 > 右,每次可以筛掉一半的数

二叉搜索树的中序遍历:升序排列
【学习笔记】树、二叉树、二叉搜索树_第5张图片
二叉搜索树常见操作
一般情况下,

  • 查询 O( log n )
  • 插入新节点 O( log n)
  • 删除. O(l log n)
    【学习笔记】树、二叉树、二叉搜索树_第6张图片
  • 删除叶子节点:直接删除
  • 删除非叶子节点:需要重新填充一下空位,一般用第一个比原来节点大的节点来替换,即原右子树的左节点来替换
    观察二叉树操作动画的网站

你可能感兴趣的:(笔记,二叉树,链表,数据结构,算法,索引)