赞
踩
二叉树搜索树:【二叉排序树】
特点:说人话,大的放右边,小的放左边。
如果对一颗二叉排序树进行中序遍历,就可以按照从小到大的顺序,将各个结点的关键码排列。
有三个指向: parent ,leftchild,rightchild
typedef int KeyType;
typedef struct {
struct BstNode* parent;
struct BstNode* leftchild;
struct BstNode* rightchild;
KeyType* key;
}BstNode;
typedef struct
{
BstNode*root;
int cursize;
}BSTree;
查询函数:
BstNode FindValue(BSTree *tree,int kx)
{
BStree *ptr = tree->root;
while( ptr!= nullptr || ptr->key != kx)
{
ptr = ptr->key < kx ? ptr->leftchild:ptr->rightchild;
}
return ptr;
}
BstNode *Search(BstNode*ptr,KeyType kx)
{
if(ptr == nullptr || ptr->key == kx) return ptr;
else if(kx > ptr->key) { return Search(ptr->rightchild,kx);}
else {return Search(ptr ->leftchild,kx);}
}
BstNode *SearchValue(BSTree *ptree,KeyType kx)
{
return Search(ptree->root ,KeyType kx)
}
**加个引用就可以改变root int p = &a; int &s = p; 作为s指针p的别名
bool Insert(BstNode *&ptr, KeyType kx) { /*if (ptr == NULL) //先判定 ptr是否为空,如果为空 { ptr = MakeRoot(kx);//创建一个根节点,这里的ptr赋值,并不能给root赋值 return true; //加个引用就可以了。 }*/ //否则 BstNode* pa = NULL; BstNode* p = ptr; ================== 要插入的值和树中的的值相同 while (p != NULL && p->key != kx) { pa = p; //用来保存双亲结点 if (kx < pa->key) p = pa->leftNode; else p = pa->rightNode; } //现在p的指向为空或者要插入的值和树中的的值相同,直接退出 if (p != NULL && p->key == kx) return false; ================== 如果p为空,或者kx值在树中不存在 p = BuyNode(); p->key = kx; p->parent = pa; ==================== 如果为空没有根节点。则走下面 if (ptr == NULL) //先判定 ptr是否为空,如果为空 { //p成为根节点 ptr = p;//创建一个根节点,这里的ptr赋值,并不能给root赋值 //加个引用就可以了。 } else { if (p->key < pa->key)pa->leftNode = p; else pa->rightNode = p; return true; } }
void InOrder(BstNode *ptr)
{
if (ptr != nullptr)
{
InOrder(ptr->leftNode);
cout << ptr->key << " ";
InOrder(ptr->rightNode);
}
}
BstNode* First(BstNode* ptr)
{
while (ptr != NULL && ptr->leftNode != NULL)
{
ptr = ptr->leftNode;
}
return ptr;
}
BstNode* Next(BstNode* ptr) { if (ptr == NULL) return NULL; if (ptr->rightNode != NULL) { return First(ptr->rightNode);//找到最左边的数 } else { //核心代码 BstNode* pa = ptr->parent; while (pa != NULL && pa->leftNode != ptr) { ptr = pa; pa = ptr->parent; } return pa; //中序遍历的最左边结点的后继 } }
//
void NiceOreder(BstNode* ptr)
{
for (BstNode* p = First(ptr); p != NULL; p = Next(p))
{
cout << p->key << " ";
}
cout << endl;
}
//找最后一个节点
BstNode* last(BstNode* ptr)
{
while (ptr != NULL && ptr->rightNode != NULL)
{
ptr = ptr->rightNode;
}
return ptr;
}
//找前驱 BstNode* Pre(BstNode* ptr) { if (ptr == NULL) return NULL; if (ptr->leftNode != NULL) { return last(ptr->leftNode);//找到最左边的数 } else { BstNode* pa = ptr->parent; while (pa != NULL && pa->rightNode != ptr) { ptr = pa; pa = ptr->parent; } return pa; //中序遍历的最左边结点的后继 } }
//倒叙 void RevNiceOreder(BstNode* ptr) { for (BstNode* p = last(ptr); p != NULL; p = Pre(p)) { cout << p->key << " "; } cout << endl; } int main() { BSTree root = NULL; int ar[] = { 53,17,78,9,45,65,87,23,81,94,88,100 }; int n = sizeof(ar) / sizeof(ar[0]); for (int i = 0; i < n; ++i) { cout << Insert(root, ar[i]) << endl;; } InOrder(root); cout << endl; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。