常见数据结构与算法个人总结-(二叉树、哈希表)

二叉树

二叉树跟树的区别在于,子节点最多只有两个,这就很好地让我们有遍历的方法。

 遍历的想法: 只要把每一个二叉树的根子节点和下面相邻一层的左右子树独立出来,就能很快遍历了。跟着做一遍,可以很快学会二叉树的三种遍历。

先序遍历:口诀,先左划一条线,然后慢慢找,左边弄完右边独立循环。

所遍历的从根节点出发,先走左字树,吧所有的根子节点看成一个根节点,等于说二叉树只看到当前子节点下面的两个子节点。本着先左后右的原则遍历,当走到最底层的左子节点的时候,返回到当前的上一个根子节点,然后再遍历完当前的右子节点,这里在里面体现就是,到H以后,先找到I,然后DHI这个字树已经遍历完毕,向上找一层,找到B,由于B已经遍历完成,然后再找E,依次将左子树遍历完成。

右子树是这样的,将第二层右子节点看成一个根节点,依次递归,当C的左子树遍历完毕,将G看成一个根子节点。

中序遍历:口诀:左边最底找根子节点,先把这行先弄完,一步一步往上传,右边独立循环。

先选择底层的左子节点,向上找当前的根子节点,然后完成当前的根节点遍历,找到右字树,之后,找D的根子节点,完成遍历,BE,这里可以直接遍历到根节点,然后将右子树看成一个新的根节点,先找到最底层的左子节点,也就是F,向上完成C,然后将G看成一个新的根子节点,找到最底层的J。依次遍历。

后序遍历:口诀:左边最底找根子节点,先把镜像弄完,一步步往上走,根节点最后放。右边独立循环。

从最底层的左子节点出发,后序遍历讲究的是一个先把子节点弄完,所以找到左子节点不会往上寻找,而是找到对应的H的右子I,遍历完之后,将D看成新的左子节点,逐步遍历。

哈希表

哈希表又称为散列表,主要是基于数组支持按照下标随机访问数据时间复杂度为O(1)的特性。比如一个学校所有的学生信息,将学号当中自增的序列作为索引下标,获取的出来的一个哈希函数。

散列冲突:这是无法避免的问题

散列函数具有确定性和不确定性:主要是确定性哈希散列值不同,原始输入也不同,key1=key2;hash(key1)=hash(key2),也就是我们常说的一个萝卜一个坑

不确定性:key1不等于key2,hash(key1)=hash(key2),这里的问题在于hash表有可能key值远远小于你所要搜索的信息长度,就会存在这样的问题。

解决方法:

开放寻址:如果出现散列冲突,重新探测一个空闲位置,将其插入。比如如果在设立散列表的时候,发现这个值得存储位置已经被占据,从当前位置开始寻找,看是否有空闲位置,如果找完没有就从头开始找,这个比较浪费时间复杂度。

散列表查找元素的时候,通过散列函数求出查找元素的键值对,比较数组下标为散列值的元素和要查找的元素,如果相等,说明我们要找的元素,否则依次向后寻找。

我们可以将删除元素设置为delete,当查到是delete的时候,继续探寻。

链表法:

在有冲突的地方拉一条链表存数据,等于在一个坑后面加上一条长长的链,以链表节点的形式插入空间当中。

图论和动态规划比较麻烦,就不看啦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值