二叉树笔记
1.基本概念:
(1)根节点
(2)叶节点
如图,即为一个完整的树模型。
2.树、图、链表之间的关系
(1)链表是特殊化的树,例如一棵树只有左子节点,而没有右子节点;或者一棵树只有右子节点,而没有左子节点。如下图。
(2)树是特殊的图,因为树是没有环状结构,如果树具有环状结构,则变成图。
3.二叉树,Python定义
class TreeNode:
def__init__(self,val):
self.val = val
self.left,self.right = None,None
4.二叉树的遍历(前中后序遍历)
(1)前序(Pre-order):根——左——右
(2)中序(In-order):左——根——右
(3)后续(Post-order):左——右——根
5.二叉树遍历,Python定义
#前序遍历
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)
注:树的操作离不开递归,所以千万不要害怕递归,要拥抱递归!!
6.二叉搜索树 Binary Search Tree
二叉搜索树,也成有序二叉树(Ordered Binary Tree),排序二叉树(Sorted Binary Tree),是指一颗孔数或者具有下列性质的二叉树:
(1)左子树上所有节点的值均小于它的根节点的值;
(2)右子树上所有节点的值均大于它的根节点的值;
(3)以此类推,左、右子树也分别为二叉查找树。(这就是重复性!!)
7.二叉查找树的操作
(1)查找:类似于二分查找
(2)插入:新建子节点
(3)删除
上述三种操作,最值得说一下的是删除操作:
①删除的节点是最末端的叶节点,那么直接删除即可,不会对数产生太大的影响。
②删除的节点下面还有子节点:
此时删除该节点会对于输的整体结构产生变化,需要在这个节点下面找到一个节点去代替当前节点,通常情况下是寻找该节点的右子树下的最小节点代替。
具体事例如下图,要删除值为65 的节点:
8.二叉搜索树的操作复杂度分析
由上图可见,二叉搜索树的操作复杂度一般为O(log(n)),在最坏的情况下(即退化为链表的情况下),其操作的复杂度将退化为O(n)。