2017年学习的数据结构作的笔记,一些算法思想(伪代码实现)在日常学习中仍显得很重要,很多很多,在此记录整理不断补充,反复看反复理解反复记忆,加油!
1、判断是否为二叉排序树(Binary Sort Tree,二叉搜索树)
status BST(BiTree T,BiTree &pre)//pre指向被访问的结点的中序前驱
{
if(T=Null)
return TRUE;
else
{
if(!=BST(T->lchild,pre))
return FALSE;
if(pre!=Null&&T->data.key<=pre->data.key)
return FALSE;
pre=T;
return BST(T->rchild,pre);
}
}//调用前第2个实际参数赋Null
2、合并两棵二叉排序树
void insertBST(BiTree &T,BiTree p)
{
if(T!==Null)
T=p;
else if(P->data.key<T->data.key)
insertBST(T->lchild,p);//小的放左边
else if(p->data.key>T->data.key)
insertBST(T->rchild,p);//大的放右边
else
free(p);
}
void mergeBST(BiTree &T1,BiTree &T2)
{
if(T2!=Null)
{
mergeBST(T1,T2->lchild);
mergeBST(T1,T2->rchild);
insertBST(T1,T2)
T2=Null;
}
}
3、二叉排序树上小于x但最靠近x的值为a,大于x但最靠近x的值为b,求a,b
void closest(BiTree T,BiTree &pre,keyType x,keyType &a,keyType &b)
{
if(T!=Null)
{
closest(T->lchild,pre,x,a,b);
if(pre!=Null&&pre->data.key<x&&T->data.key=x)
a=pre->data.key;
if(pre!=Null&&pre->data.key<=x&&T->data.key>x)
b=T->data.key;
pre=T;
closest(T->rchild,pre,x,a,b);
}
}
4、平衡二叉排序树的每个结点增设lsize域,其值为它的左子树的结点数加1,确定第k小的结点的位置
BiTree Locate(BiTree T,int k)
{
if(T==Null)
return Null;
else
{
if(T->lsize==k)
return T;
else if(T->lsize>k)
return Locate(T->lchild,k);
else
return Locate(T->rchild,k-T->lsize);
}
}