数据结构-数、二叉树、二叉搜索树

单链表查询速度太慢,因此产生了跳表,即引入了步长的概念加上了更快的索引
要加速链表查询速率的核心思想是升维,升到二维的数据结构(常见的有树和图,树和图最关键的差别是有没有环,如果当前的节点只连接到新的儿子节点,永远都不会走回去,没有形成环状就是树,有环状就是图),当单链表有多个指针的时候就变成了树
	--->链表是特殊化的树,树是特殊化的图(没有环状的图就是树)

树有根节点,在根节点左边的部分称为左子树,在根节点右边的部分称为右子树,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/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值