给定二叉查找树中的两个节点,求它们的最近公共祖先(Lowest Common Ancestor - LCA)。
在详细介绍之前,可以先参考下这篇文章"二叉树(70) - 最近公共祖先[1]"
函数原型定义如下:
Node *getLCA(Node* root, int n1, int n2)
其中n1和n2是指定的两个节点值。
例如, 上述BST中,10和1...
分类:
其他好文 时间:
2015-06-16 01:22:54
阅读次数:
201
在本系列的第一篇文章中,已经介绍过了二叉查找树的一些性质:
节点的左子树中任意节点值小于根节点节点的右子树中任意节点值大于根节点左右子树都必须是二叉查找树,不允许存在重复节点。
基于上面的这些性质,自然的就得到了这种判断方式:树中的每个节点都有一个特定的值。
假设树的节点定义为:
struct Node
{
int key;
Node...
分类:
其他好文 时间:
2015-06-16 01:21:58
阅读次数:
119
在WikiPedia中,对二叉查找树的定义如下:
二叉查找树,是一种基于节点的二叉树,有下面的性质:
节点的左子树中任意节点值小于根节点;
节点的右子树中任意节点值大于根节点;
左右子树都必须是二叉查找树,不允许存在重复节点。
二叉查找树的上述性质,保证了各节点值的顺序,这样进行查找,求最大值最小值时,会效率更高。如果没有这种顺序,则可能需要树中的将每个节点与指定的查找值进行比较。...
分类:
其他好文 时间:
2015-06-15 23:57:34
阅读次数:
180
构建一个递归函数treeToList(Node root),将一棵已排序的二叉树,调整内部指针,使之从外面看起来,是一个循环双向链表。其中前向指针存储在"small"区域,后向指针存储在"large"区域。链表需要进行调整进行升序排序,并返回链表头指针。
下面的这篇文章详细解释了这个转换的过程。
http://cslibrary.stanford.edu/109/TreeListRecursi...
分类:
编程语言 时间:
2015-06-14 15:14:41
阅读次数:
167
平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.平衡二叉树的前提是二叉排序树,不是二叉排序树的都不是平衡二叉树。
平衡因子BF(Balance Factor):二叉树上节点的左子树深度减去右子树深度的值。最小不平衡子树:距离插入...
分类:
其他好文 时间:
2015-06-09 23:48:22
阅读次数:
414
二叉排序树(Binary Sort Tree),又称二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树。
若它的左子树不空,则左子树上所有节点的值都小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值都大于它的根节点的值;
它的左、右子树也分别为二叉排序树。
上面就是一棵二叉排序树,当我们对它进行中序遍历时,就可以得到一个有序的序列{35,37,47,51,58,62,73,88...
分类:
编程语言 时间:
2015-06-09 20:08:34
阅读次数:
266
查找
根据给定的某个值,在查找表中确定一个其关键字(唯一的标识一个记录)等于给定值的数据元素或数据记录。静态查找:只查找,不修改元素[线性表、顺序查找、二分查找]
动态查找:查找时,插入或者删除元素[二叉排序树]顺序表查找
顺序查找(针对静态查找表),也叫线性查找O(n),从头开始遍历,直到最后一个记录。
优化:添加哨兵//有哨兵的顺序查找
int foo(int *a,int n,int...
分类:
其他好文 时间:
2015-06-09 17:18:33
阅读次数:
182
伸展树
伸展树(Splay Tree),也叫分裂树,是一种二叉排序树,它由Daniel Sleator和Robert Tarjan创造,后者对其进行了改进。
假设想要对一个二叉查找树执行一系列的查找操作。为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。splaytre...
分类:
其他好文 时间:
2015-06-04 01:03:35
阅读次数:
187
有序链表0->1->2->3->4->5转换为一个二叉排序树。我们在此创建一个平衡二叉排序树1.先找链表到中间的节点2.中间节点的val创建一个新的树节点TreeNode3.将链表断裂为2部分4.递归创建左子树和右子树#include#includeusing namespace std;struc...
分类:
编程语言 时间:
2015-06-03 21:21:46
阅读次数:
131
这篇博客主要讲解B树及其插入删除操作,并给出操作的流程图以达到清晰易懂的目的,尽管标题是从二叉排序树到平衡二叉树再到红黑树系列3,没有B树二字,但他们都是动态查找树,所以我将他们归为一个系列。
B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树。它以一种很自然的方式推广了二叉搜索树,B树与红黑树的不同之处在于B树结点的孩子不限于最多为2,而是可以有数个到数千个不定。因为结点的分支更多...
分类:
编程语言 时间:
2015-05-29 20:23:55
阅读次数:
183