二叉排序树_插入+删除+查找

来源:互联网 发布:目前最好的淘宝客程序 编辑:程序博客网 时间:2024/06/06 00:19

原本是想写关于android分享功能的博客,但是没真机不好去测试,大白天的手机被3岁娃娃,拿去看少儿频道了,大哭,悲催撒!好啊,我还是总结下我学的C/C++相关的知识。

关于二叉排序树的定义是

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
// Simple.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;#include <algorithm>#include <string.h>#include <stdio.h>typedef struct  BTNode{int key;struct BTNode *lchild;struct BTNode *rchild;}BTNode;//递归查找法BTNode *BSTSearch(BTNode *bt,int key){if(bt==NULL){return NULL;}else{if (bt->key==key)return bt;else if(key<bt->key)return BSTSearch(bt->lchild,key);elsereturn BSTSearch(bt->rchild,key);}}//非递归查找法BTNode *NoBSTSearch(BTNode *p,int key){bool solve=false;while (p&&!solve){if(key==p->key)solve=true;else if (key<p->key){p=p->lchild;}else{p=p->rchild;}}if(p==NULL){cout<<"没有找到"<<key<<endl;}return p;}//递归插入法int BSTInsert(BTNode *&bt,int key){if(bt==NULL){bt=(BTNode *)malloc(sizeof(BTNode));bt->lchild=bt->rchild=NULL;bt->key=key;return 1;}else{if (key==bt->key)return 0;else if(key<bt->key){return BSTInsert(bt->lchild,key);}else return BSTInsert(bt->rchild,key);}}//非递归插入法int BSTInsert2(BTNode *&t,int key){BTNode *p=(BTNode*)malloc(sizeof(BTNode));BTNode *q=t;p->key=key;p->lchild=p->rchild=NULL;if(t==NULL){t=p;return 1;}while (q->lchild!=p&&q->rchild!=p){if (key<q->key){if(q->lchild){q=q->lchild;}else{q->lchild=p;}}else{if (q->rchild){q=q->rchild;}else{q->rchild=p;}}}return 1;}//非递归删除bool DelBST(BTNode *&t,int x){ bool find = false;    BTNode *q=t;    BTNode *p = t;    while(p && !find){  //寻找被删元素 if(x == p->key){  //找到被删元素             find = true;            }    else if(x < p->key){ //沿左子树找             q = p;            p = p->lchild;            }        else{   //沿右子树找             q = p;            p = p->rchild;            }    }    if(p == NULL){   //没找到         cout << "没有找到" << x << endl;        }    if(p->lchild == NULL && p->rchild == NULL){  //p为叶子节点if(p == t){  //p为根节点             t = NULL;            }else if(q->lchild == p){   q->lchild = NULL;        }else{            q->rchild = NULL;            }        free(p);  //释放节点p     }else if(p->lchild == NULL || p->rchild == NULL){ //p为单支子树 if(p ==t){  //p为根节点             if(p->lchild == NULL){                t = p->rchild;                }                else{                t = p->lchild;                }        }else{            if(q->lchild == p && p->lchild){ //p是q的左子树且p有左子树                 q->lchild = p->lchild;    //将p的左子树链接到q的左指针上             }                else if(q->lchild == p && p->rchild){                q->lchild = p->rchild;                }            else if(q->rchild == p && p->lchild){                q->rchild = p->lchild;                }            else{                q->rchild = p->rchild;            }        }        free(p);    }else{ //p的左右子树均不为空 BTNode *t = p;        BTNode *s = p->lchild;  //从p的左子节点开始         while(s->rchild){  //找到p的前驱,即p左子树中值最大的节点             t = s;               s = s->rchild;            }p->key = s->key;   //把节点s的值赋给p         if(t == p){            p->lchild = s->lchild;            }            else{            t->rchild = s->lchild;            }        free(s);     }    return find;}int main(){BTNode *T;T=NULL;BSTInsert2(T,15);BSTInsert2(T,5);BSTInsert2(T,3);BSTInsert2(T,12);BSTInsert2(T,10);BSTInsert2(T,13);BSTInsert2(T,6);BSTInsert2(T,7);BSTInsert2(T,16);BSTInsert2(T,20);BSTInsert2(T,18);BSTInsert2(T,23);DelBST(T,5);BTNode *a=NoBSTSearch(T,16);system("pause");    return 0;}



0 0