随笔分类 - 算法及数据结构
摘要:首先简单描述一下二叉搜索树的删除过程,可以分为以下四种情况 1. 要删除的节点没有左右孩子 2. 要删除的节点只有左孩子 3. 要删除的节点只有右孩子 4. 要删除的节点有左右孩子 对于第一种情况,直接删除。 如果要删除的节点只有左孩子,那么就让该节点的父亲结点指向该节点的左孩子,然后删除该节点,返
阅读全文
摘要:红黑树的特性: 红黑树中的每个结点包含五个域:color、key、left、right和parent。如果某结点没有一个子结点或父结点,则该结点相应的指针parent域包含值为NIL(NIL并不是空指针,后面会讲到)。把NIL视为指向红黑树的外结点(叶子)的指针,而把带关键字的结点视为红黑树的内结点
阅读全文
摘要:AVL树的介绍 AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 AVL树的C++实现 1. AVL树节点 2. 旋转 如果在AVL树中进行插入或者删除节点,可能导致AVL树失去了平衡。这种失衡可以概括为以下四种状态: LL :LeftLeft,也称为"左左
阅读全文
摘要:平衡二叉树 判断是否为平衡二叉树,需要注意以下三点: 左子树是否为平衡二叉树 右子树是否为平衡二叉树 左右子树的高度差小于等于1 搜索二叉树 将二叉树进行中序遍历,得到的结果是完全升序的二叉树就是搜索二叉树。 完全二叉树 在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最
阅读全文
摘要:"先序遍历" 先序遍历可以简单的理解为: 首先访问根节点,如果根节点的左子树存在,那么递归的对根节点的左子树进行先序遍历,如果根节点的右子树存在,那么递归的对根节点的右子树进行先序遍历。访问顺序为父 左 右。 可以利用一个辅助栈完成非递归的先序遍历,我们先将根节点压入栈中,在栈非空的时候弹出辅助栈的
阅读全文
摘要:"Leetcode 92:反转链表II" 解决这道题需要三个步骤: 1. 找到需要反转的第一个节点。可以通过头节点前进m 1步,找到反转开始的位置。 2. 将需要反转的部分进行反转。参考 "Leetcode 206:反转链表" 。 3. 将反转部分与剩余部分进行链接。其中分为两种情况,m=1与m 1
阅读全文
摘要:利用一个固定数组实现栈和队列 具有返回min功能的栈 使用两个栈,一个为data栈,一个为min栈。在进行push操作时,首先向data栈中push值,如果push的值小于min栈的栈顶,则向min栈中push这个值,如果大于等于min栈的栈顶,则再push一个min栈栈顶的值。在进行pop操作时,
阅读全文
摘要:堆的概念 堆是用数组实现的二叉树,它没有使用父指针或者子指针。利用数组的下标,就可以得到节点的父节点与子节点在数组中的位置。下标为i的节点,在不越界的情况下,它的左孩子坐标为2i+1,右孩子坐标为2i+2,父节点为(i 1)/2。 堆分为两种,大根堆与小根堆。在大根堆中,父节点的值比每一个子节点的值
阅读全文
摘要:荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。 这个问题的解决思路是这样的,首先划定一个小于区域,其右边界为less,划定一个大于区域,其左边界为more。
阅读全文
摘要:递归就是程序反复调用自身,这说明它每一级的功能是一样的, 因此我们只需要关注一级递归的解决过程即可 。 我们在解决递归问题时,需要关心的主要是以下三点: 1. 整个递归的终止条件。 2. 一级递归需要做什么? 3. 应该返回给上一级的返回值。 因此,也就有了我们解递归题的三部曲: 1. 找整个递归的
阅读全文

浙公网安备 33010602011771号