树和图
树和二叉树
树的产生是由链表构成,人们觉得链表可以不止一个next,可以有多个next,不过称其为next有点不对劲,所以就有了左和右,即左树右树.
术语:
根节点,父亲结点,孩子结点,字数,层数代表距离
图
那么我们除了有next往下指以外,能否说子节点可以往回指,指上去,指到根节点,那么这就叫做图Graph
简单总结:链表就是特殊化的树,树就是特殊化的图
树节点的实现:
python:
class TreeNode:
def __init__(self,val):
self.val = val
self.left,self,right = None,None
Java:
public class TreeNode{
public int val;
public TreeNode left,right;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
二叉搜索树
如果左子树和右字数是无序的,那么没有把树的特点发挥出来,所以有人发明了二叉搜索树出来,搜索 means 子节点的有序性
- 二叉搜索树(有序二叉树、排序二叉树):一颗空树或具有下列特质的二叉树
- 左子树上所有结点的值均小于它的根结点的值
- 右子树上所有结点的值均大于它的根结点的值
- Recursively【递归地、以此类推】,左、右子树也分别为二叉搜索树
复杂度分析
最坏情况就是,没有左子树或者右子树,每次都是只找一边的树,那么就退化成了O(N),退化成一条很长的链.
其实有了别的方法,也出现了很多树,例如红黑树,红色框内前三种属于平衡二叉搜索树,实现比较复杂
java和C++内部实现的二叉搜索树都是红黑树~