C++数据结构====二叉查找树

C++二叉查找树:Binary Search tree

二叉查找树默认左子树的值都比根节点小,右子树都比根节点大,这个定义排除了树中存在值相同节点的可能性。这便是二叉查找树称为一个用关键值KEY快速查找的工具。

二叉树类:

class bst{struct Node{T data;Node* L;Node* R;Node(const T& d):data(d),L(),R(){}Node(const T& d,Node* L,Node* R):data(d),L(L),R(R){}};typedef Node* tree;Node* rp;//指向根节点指针int n;//记录节点个数};

1.插入一个节点; void(tree& t,Node* p)//在一棵树树中插入一个节点

if(空树),作为根结点插入

if(大于根节点值),插入右子树

else 插入左子树

void myinsert(tree& t,Node* p)//在一棵树中插入一个节点{if(t == NULL)t = p;else if(p->data < t->data)myinsert(t->L,p);elsemyinsert(t->R,p);}

2.查找一个节点: tree& (tree& t,const T& d)//在一棵树中寻找节点d,,返回一个指向这个节点的指针。

if(t==NULL) return t;

if(t->data==d) return t;

if(d < t->data) return 左子树中查找

else return右子树查找

tree& myfind(tree& t,const T& d)//返回以d为根节点的子树的根指针{if(t==NULL)return t;else if(d==t->data) return t;//没找到else if(d<t->data) return myfind(t->L,d);//return 一定要带上else return myfind(t->R,d);}void tr

3.删除一个节点:void dele(tree& t,const T& d)

特殊:

叶子节点

单子节点

双子节点—->左右子树合并

1.找到这个节点,即返回指向这个节点的指针pn

2.备份一份指针p=pn

3.左右子树合并

4.Delete节点

5.节点数-1

bool dele(const T& d){//返回那个节点的根指针,另存一份//左右子树合并,根指针指向右子树,释放节点tree& t = myfind(d);if(t == NULL) return false;Node* p = t;if(t->L!=NULL) myinsert(t->R,t->L);t = t->R;delete p;–n;return true;}

4修改一个节点; void(const T& olddata,const T& newdata)

1,删掉这个节点

2.插入一个节点

void update(const T& olddata,const T& newdata){dele(olddata);myinsert(newdata);}5.遍历二叉树 //中根遍历

遍历左子树

遍历根节点

遍历右子树

void travel(const tree& t)const{if(t != NULL){travel(t->L);cout << t->data <<' ';travel(t->R);}}6.清空一棵树

先清左子树

在清右子树

delete根节点 void clean(tree& t)//清空一棵树{if(t!=NULL){clean(t->L);clean(t->R);delete t;t=NULL;}}7.求树的深度

int high(tree& t)const//求一棵树的高度{if(t == NULL) return 0;int lh=high(t->L);int rh=high(t->R);return 1+std::max(lh,rh);}

8.二叉树的层次遍历

1.如果是空树,over

2.创建队列,根节点进队

3 只要队列不为空,

3.1 出队一个元素

3.2访问其中数据

3.3左右非空子树入队

void prin(tree& t){if(!t) return;deque<tree> di;di.push_back(t);while(!di.empty()){tree& t=di.front();cout << t->data << ' ';if(t->L)di.push_back(t->L);if(t->R)di.push_back(t->R);}}加换行符,每层遍历加一个换行

1.如果是空树,over

2.创建队列,根节点进队,NULL进队

3 只要队列size>1,

3.1 出队一个元素

3.2如果是NULL,换行,NULL进队尾。continue

3.2访问其中数据

3.3左右非空子树入队

void print(tree& t ){if(t==NULL)return;deque<tree> di;//创建队列di.push_back(t);//根节点入队di.push_back(NULL);while(di.size()!=1)//只要非空{tree& t=di.front();//取出一个元素if(t==NULL){cout << endl;di.pop_front();di.push_back(NULL);continue;}cout << t->data << ' ';//访问数据di.pop_front();if(t->L)di.push_back(t->L);//左右子树非空节点入队if(t->R)di.push_back(t->R);}}

不义而富且贵,于我如浮云。

C++数据结构====二叉查找树

相关文章:

你感兴趣的文章:

标签云: