树
单链表查询速度太慢,因此产生了跳表,即引入了步长的概念加上了更快的索引
要加速链表查询速率的核心思想是升维,升到二维的数据结构(常见的有树和图,树和图最关键的差别是有没有环,如果当前的节点只连接到新的儿子节点,永远都不会走回去,没有形成环状就是树,有环状就是图),当单链表有多个指针的时候就变成了树
--->链表是特殊化的树,树是特殊化的图(没有环状的图就是树)
树有根节点,在根节点左边的部分称为左子树,在根节点右边的部分称为右子树,B、C都为根节点A的儿子节点 ,F、G互为兄弟节点,层可以从0层开始,也可以从1层开始
树的节点定义之Java实现
public class TreeNode {
public int val;
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
}
树的节点定义之其他语言实现
//python
class TreeNode:
def_init_(self,val):
self.val = val
self.left,self.right = None,None
//c++
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x),left(NULL),right(NULL) {}
}
二叉树
实际生活中,用的比较多的是二叉树,二叉树的儿子节点只有两个
二叉树遍历
由于需要访问根节点,还有访问对应的左子树和右子树,总共需要三句语言,这三种语言的顺序的不同就变成了不同的遍历方式
二叉树遍历Pre-order/,In-order/Post-order
1.前序(Pre-order):根-左-右
2.中序(ln-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)
二叉搜索树
二叉搜索树Binary Search Tree
二叉搜索树,也称二叉搜索树、有序二叉树(Ordered Binary Tree)、排序二叉树(Sorted Binary Tree),是指一棵空树或者具有下列性质的二叉树:
1.左子树上所有结点的值均小于它的根结点的值:
2.右子树上所有结点的值均大于它的根结点的值;
3.以此类推:左、右子树也分别为二叉查找树。
(这就是重复性!)
中序遍历:升序排列
二叉搜索树常见操作
1.查询
2.插入新结点(创建)
3.删除
二叉搜索树增删改查的时间复杂度一般都是O(logn),除了一种特殊情况,就是二叉搜索树所有父节点只有左子节点或者只有右子节点的情况,此时二叉搜索树就退化成为了单链表,此时增删改查的时间复杂度为O(n)
注意:如果删除的节点是中间的节点,一般会找和该节点相差较少的节点,那么有两种办法:
1.找该节点左子树中最大的节点
2.找该节点右子树中最小的节点(一般来说会采取该种方法,取其右子树中第一个大于欲删除节点的节点)
https://visualgo.net/zh/bst
练习
树的算法题的解法一般都是递归
•中序遍历二叉树 https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
•前序遍历二叉树 https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
•后序遍历树 https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/
•前序遍历树 https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/
•广度优先遍历 https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/