C++数据结构重要知识点
文章平均质量分 92
除C语言数据结构易错知识点外的知识点整理
-SGlow-
这个作者很懒,什么都没留下…
展开
-
C++数据结构重要知识点(1)(二叉搜索树、key和key-value模型)
首先我们要找到该插入的位置的父节点,用一个指针太麻烦了,我们需要一个指针在前面探路,用find类似的代码去找这个结点,另一个结点就是这个探路指针对应的父节点,当探路的走到空之后,另一个就指向了正确的父节点。,如1,2,3,4,5,6,7,8,9这几个数字,如果先插入1,那么根的左边就是空的,数据全部存到右子树了。搜索树中搜索是很重要的功能,根据左小右大的原则,我们可以很快写出相关代码,注意考虑空树,如果逻辑不完善,要补上。当根的左右都有结点时,逻辑是严密的,但如果根的左边或右边没有结点了,怎么办?原创 2024-07-18 16:30:37 · 686 阅读 · 0 评论 -
C++数据结构重要知识点(2)(AVL树及其插入操作)
我们知道,插入只会使得平衡因子+1或-1,说明插入前只能是-1或1,意味着直接父结点的左边或右边已经有了一个节点了,新增的这个结点只是让它变平衡。这种情况下,在祖父看来,它的子树。其中,平衡因子用_bf来标识,在实现中,平衡因子的计算可以左树高度减右树高度,也可以右树减左树,随便选择,因为判断要不要旋转取决于平衡因子的绝对值,2和-2本质上没区别,如果上面的都理解了,我们自然也能理解每插入一个新的结点,对应父辈平衡因子的更新应当是从下往上走的,有的情况父辈会受影响,有的就不会,我们从直接父节点开始讨论。原创 2024-07-24 11:03:23 · 1048 阅读 · 0 评论 -
C++数据结构重要知识点(3)(红黑树及其插入操作)
单旋的实现和AVL树的一样,虽然模型不一样,AVL树的旋转模型对子树的高度有讲究,红黑树没有,但它们本质上要处理的结点一样,要注意的nullptr也一样。,如果这时还有nodeU且为红,就一组一组向上更新,只要nodeP、nodeG为空,就会跳出循环,不用担心越界问题。根据上面插入节点的代码可知,每次插入后nodeC都指向新插入的结点,nodeP是它的父节点,我们可以从一个节点开始,慢慢地加节点,思考可能出现的情况,这是解决复杂难题的一个方式。其中,AVL树的左右子树的高度差不超过1,而。原创 2024-07-26 17:59:44 · 685 阅读 · 0 评论 -
C++数据结构重要知识点(4)(map和set封装)
所以,1和3这种情况就是要去找一个父节点,使得对于这个父节点而言,上个节点是在它的左子树,如1->2,3->4。我们发现,it所在的位置都可以看作所在子树的根节点,根据左中右的规则,每次it++都是访问这个右树的最左结点,如2->3,4->5。如果这颗被访问完的子树如果是上一个父节点的右子树,根据左中右,父节点所在的树也访问完了。只要理解了上面的思想方法,代码就很简单了,总体思路同样是nodeP向上探路,nodeC在后面跟着,nodeC如果是nodeP的左,就意味找到了父节点。原创 2024-08-01 15:22:08 · 1059 阅读 · 0 评论 -
C++数据结构重要知识点(5)(哈希表、unordered_map和unordered_set封装)
线性探测是把这个坑占了去找挨着的下一个,二次探测是是按照第一次走1^2,如果这个位置也被占了就走2^2,以此类推,三次探测也一样。这里的K就是key的类型,专门为string写了一个特化,其实库里面也是这么做的,string毕竟还是太常见了。,当我们扩容对原来的数据进行重映射时,我们自然希望继续利用好我们的空间,也就是直接将指针交给新的位置保管而不是。如果我们想要找到这个数据,我们只需要再次映射,先找到本来该待的位置,比较数据是否一样,一样就找到了,我们试想,如果我们按照取模的的思想,原创 2024-09-07 20:56:09 · 563 阅读 · 0 评论