011——二叉搜索树 (3)二叉搜索树/二叉排序树BST 在二叉树的基础上增加一些规则:1.如果某节点的左子树不空 ,左子树上所有的节点的值都要小于该节点的值2.如果某节点的右子树不空,右子树上所有的节点的值都要大于该节点的值3.所有节点都要满足以上约束。
010——二叉树(2)线索化 每一个结点可以有多个孩子,这并不利于我们判断非空指针域个数,所以我们可以考虑每个结点的父亲,因为一个结点的父亲结点有且仅有一个(根节点没有父亲),因此非空指针域为n-1,那么剩下的n+1个指针为空指针。情况2:x->rFLAG==0,x的右指针域是孩子, 就是后继下右子树中最靠左的节点就是后继。情况2:x->lflag==0,x的左指针域是孩子,x的左子树中最靠右的节点是前驱。情况1:x->rflag==1,x的右指针域是线索,x->rflag就是后继。同时这也说明,存在这n+1的指针域空间的浪费。
008——树 根据上图,我们可以申请一个t数组,t数组中存放有数据和指向孩子的链表,在链表中存放孩子结点的下标,所以代码如下(这里需要注意,链表只是结构体数组的一个成员变量,t的本质仍是数组)树和子树之间的关系,可以类比于集合和子集,但是子树的根节点下的所有结点都包括的才叫做子树,下面图片圈出来的都是,若是ABCD组成的并不叫作子树。注意:结点间的关系是相对的,如果在没有前提的条件下,说谁是谁的xx(关系)的说法是错误的。树的度:树中所有的结点的最大值 ,如上图的树的度是3。根结点:没有前驱的结点,如上图的A。
006——队列 一种受限的线性表(线性逻辑结构),只允许在一段进行添加操作,在另一端只允许进行删除操作,中间位置不可操作,入队的一端被称为,出队的一端被称为在而我们会用两个指针分别用于标记队首和队尾,分别叫做队首指针和队尾指针。
004——双向链表和循环链表 不同于单链表,双向链表不仅可以往后指向,还可以往前指向,则双向链表是在单链表的基础上,每个结点增加一个指针域,这个指针域保存上一个结点的地址。注意,在这里对数据进行处理时,我们不能使得这个线(单向的,无论是正向还是负向)断掉,比如像下面这种情况,就是。由003——单链表可知,单链表分为带头结点的不带头结点的,双向链表也是同理(上图的是带头结点的)从头结点开始遍历找到尾结点,在尾结点的后面插入新的结点(需要多维护一个pre)此时还要考虑L为空的情况,因为这个时候的②是不存在的。修改代码与单链表是相同的。
003——单链表 因为在我们的指针域中,存储的是下一个结点的地址,而不是下一个数据的地址。因为在结点中既包含数据又包含指针域,只有这样才能将一个又一个的结点串起来。要是这么说不能够理解,我们也可以换一种想法,此时我们的示例中只有一个数据,要是该链表再复杂一些,有100个数据,难道我们要定义100个指针吗?显然是不可能的,而存储下一个结点则可以有效避免这个问题。
002线性逻辑结构——线性表 线性表:具有相同数据类型的有限个(n)数据元素的序列当n=0时是空表,n>1时,L=(a1,a2,a3,...,an)a1表头元素 an表尾元素除了a1以外,其他元素都有唯一的前驱元素除了an以外,其他元素都有唯一的后继元素。
C++——STL——栈和队列 队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作的线性表,允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。队列的示意图队列中的元素除了具有线性关系外,还具有先进先出的特性。
Java——多态 这一行代码中,A就相当于数据类型,所以ab所能操作的只能使用A那部分的内存,不过如果run方法重写了以后,这个重写的run方法相当于由A和B所共享了,所以此时还可以调用run方法。当使用父类引用调用重写的方法时,实际执行的是子类中的方法。在这个例子中,尽管通过父类引用指向了子类对象,但是在调用静态方法时,仍然是根据引用的类型(而不是对象的实际类型)来决定调用哪个静态方法,这体现了静态方法不具有多态性。可以使用父类的引用指向不同的子类对象,根据实际情况动态地调用不同子类的方法,提高了代码的灵活性和可复用性。
Java——三个关键字:static 在Java中,static是一个关键字,用于修饰类的成员(变量、方法等)。静态成员属于类本身而不是类的实例,这意味着每个类都有唯一的静态变量副本,所有该类的对象共享这个副本,而不论创建了多少个对象。有static修饰的代码和没有static修饰的代码的区别:有static修饰的代码属于类,没有static修饰的代码属于对象属于类的东西是被所有对象所共享的。
C++——STL——vector容器 如果将这里的a.begin(),a.end()的内容改成a.begin(),a.begin()+1,则只会拷贝a中一个元素的内容。,还有一类迭代器是可以取反的a.rbegin(),a.rend()。创建一个类型为int的数组,数组的元素个数为10,元素的值默认为0。创建一个类型为int的数组,数组的元素个数为10,元素的值为3。设置向量为某个向量中[first,last)的元素。而针对a.begin(),a.end()这样的。注意:这里a.begin(),a.end()是。返回向量中元素的个数。
C++——STL——string容器 将字符串从下标pos1开始删除n1个字符,删除后在下标pos1处插入s从下标pos2开始的n2个字符。将字符串从下标pos1开始删除n1个字符,删除后在下标pos处插入c的前n2个字符。将字符串从下标pos1开始删除n1个字符,删除后在下标pos1处插入n2个ch字符。将字符串从下标pos开始删除n个字符,删除后在下标pos处插入c。将字符串从下标pos开始删除n个字符,删除后在下标pos处插入s。删除字符串从pos下标开始(包括pos下标)的n个字符。删除迭代器【first, last)区间的字符。
Java中小细节 当创建两个变量内容相同时,二者的内容是相等的原因:以该形式创建字符串会存储在字符串常量池,而同样的内容在常量池中只会存储一份,避免造成空间浪费,所以是相等的对于基本数据类型来说,==比较的是值是否相同对于引用数据类型来说 ,==比较的是地址是否相同。