前面学习过二叉树的基本遍历与创建,今天学习二叉树中的二叉查找树,也叫二叉搜索树。
一、二叉搜索树的特点
1、若左子树不为空,则左子树上所有结点的值均小于它的根节点的值;多右子树不为空,则右子树上所有结点的值均大于它的根节点的值;
2、二叉查找树的左右子树也是一颗二叉查找树。
3、二叉查找树的中序遍历是一个升序序列。
4、二叉查找树没有键值相等的节点。
二、二叉查找树的创建。
一、思路:
当我们有一个无序数组,且数组的元素不重复,根据此数组创建一颗二叉查找树。
(1)在数组中任意选取一个元素作为根节点(为了方便我们取第一个元素)
(2)创建一个节点P,并根据该节点的数据值(data),在已有的二叉查找树中寻找插入位置。
1、对于每一个结点都有OLDP,P->data大于OLDP-data则该节点向右结点搜寻,即OLDP = OLDP->right;
若P->data小于 OLDP-data则该节点向左结点搜寻OLDP = OLDP->left。
2、循环实现1 直到OLDP == NULL ,说明P结点已经寻找到需要插入的叶子结点。
3、因为OLDP已经为NULL,不能插入,我们需要寻找的是叶子结点,因此需要使用一个节点LAST,
LAST结点满足 LAST->right/left = OLDP
(3)对于每一个数组元素都需要进行第2步,直到数组元素全部存储。
二、代码:
Node *CreatTree(DataType *a, int N)
{
Node *root = (Node*)malloc(sizeof(Node));
Node *P = NULL,*Last = NULL,*Path = root;
root -> data = a[0];
root->left = NULL;
root->right = NULL;
if (root&&a&&N>0)
{
for (int i = 1; i < N; i++)
{
P = (Node*)malloc(sizeof(Node));
P->data = a[i];
P->left = NULL;
P->right &