二叉树就是一棵顺序树,优化查找效率。一组相同的数据所构造出来的二叉查找树不同。
- 二叉查找树的查找:(一个函数)
struct Node{ int data; Node* lchild,rchild; }; //查找 void search(Node* root,int x){ //指向树的指针,要查找的树 if(root==NULL) return; //查找失败,递归边界 if(root->data==x){ printf("%d",root->data); //找到了该数 }else if(root->data>x){ search(root->lchild,x); } else{ search(root->lchild,x); } }
- 二叉查找树的插入:(一个直接函数,一个引用函数(node* newNode(int x)))
//插入 void insert(Node* &root,int x){ if(root==NULL){ //空树,递归边界 Node* root=newNode(x); return; } if(root->data==x){ //已存在,直接返回 return; } else if(root->data>x){ //x小于根结点 insert(root->lchild,x); } else{ insert(root->rchild,x); } } Node* newNode(int x){ Node* node=new Node; //创建一个新的结点 node->data=x; //给新节点赋值 node->lchild=node->rchild=NULL; //设置新节点左右两边均为空 return node; }
- 二叉查找树的建立:(一个直接函数,一个引用函数(该函数含一个引用函数newNode(int x))
//构建 node* create(int data[],int n){ //插入一组数据,这组数据有n个数 Node* node=NULL; //新建根结点 for(int i=0;i<n;i++){ insert(root,data[i]); } return root; }
- 二叉查找树的删除:(三个直接函数)
//删除 //查找左子树中的最大值 Node* findMax(Node* root){ while(root->rchild!=NULL){ root = root->rchild; } return root; } //查找右子树中的最小值 Node* findMin(Node* root){ while(root->lchild!=NULL){ root=root->lchild; } return rootl } void deleteNode(Node* &root,int x){ if(root==NULL) return; if(root->data==x){ //找到了x if(root->lchild==NULL&&root->rchild==NULL){ root=NULL; //叶子结点直接删除 }else if(root->lchild!=NULL){ //该结点左子树不为空,找左子树中最大值 Node* pre=findMax(root->lchild); root->data=pre->data; deleteNode(root->lchild,pre->data); //查找该结点的左子树,并删除那个结点 }else if(root->rchild!=NULL){ Node* next=findMin(root->rchild); //查找右子树中的最小值 root->data=next->data; deleteNode(root->rchild,next->data); //查找该结点的右子树,并删除那个结点 } }else if(root->data>x){ //根结点大于x,向左查找 deleteNode(root->lchild,x); }else{ //根结点小于x,向左查找 deleteNode(root->rchild,x); } }