二叉排序树的创建、插入、删除
二叉排序树的创建
首先定义树节点treeNode:包含节点的值value 以及其左右孩子指针left right
1 class treeNode 2 { 3 public: 4 int value; 5 treeNode *right,*left; 6 treeNode():right(NULL),left(NULL){} 7 };
定义二叉排序树Tree:包含根节点Root,节点个数num,以及构造函数(创建树)、中序遍历(输出排序结果)、插入和删除函数
#include<bits/stdc++.h> using namespace std; class Node{ public: int value; Node *lchild,*rchild; Node():lchild(NULL),rchild(NULL){}; ~Node(){}; }; class Tree{ int num; Node *root; void Inorder(Node *t); void CreateTree(int a,Node *&t); void Search(int a,Node *&t); void Delete(int a,Node *&t); void setnum(); public: Tree(){ root=NULL;num=0; } ~Tree(){}; void Inorder(); void Create(int a); void Search(int a); void Delete(int a); }; void Tree::setnum(){ num=0; } void Tree::Create(int a){ CreateTree(a,root); } void Tree::CreateTree(int a,Node *&t){ if(t==NULL){ t=new Node; t->value=a; t->lchild=NULL;t->rchild=NULL; } else{ if(t->value>a){ CreateTree(a,t->lchild); } else{ CreateTree(a,t->rchild); } } } void Tree::Inorder(){ Inorder(root); cout<<endl; } void Tree::Inorder(Node *t){ if(t){ Inorder(t->lchild); cout<<t->value<<" "; Inorder(t->rchild); } } void Tree::Search(int a){ setnum(); Search(a,root); } void Tree::Search(int a,Node *&t){ if(t==NULL){ cout<<"-1"<<endl;return; } else{ if(a==t->value){ num++;cout<<num<<endl;return; } else if(a<t->value){ num++;Search(a,t->lchild); } else if(a>t->value){ num++;Search(a,t->rchild); } } } void Tree::Delete(int a){ Delete(a,root); } void Tree::Delete(int a,Node *&t){ if(t){ if(a==t->value){ if(t->lchild==NULL){ Node *n=t; t=t->rchild; free(n); } else if(t->rchild==NULL){ Node *n=t; t=t->lchild; free(n); } else{ Node *m=t->lchild; Node *n=t; while(m->rchild){ n=m; m=m->rchild; } t->value=m->value; if(n!=t){ n->rchild=m->lchild; } else{ n->lchild=m->lchild; } free(m); } } else if(a<t->value){ Delete(a,t->lchild); } else if(a>t->value){ Delete(a,t->rchild); } } } int main() { int t;cin>>t; while(t--){ int n;cin>>n; int *a=new int[n]; Tree tree; for(int i=0;i<n;i++){ cin>>a[i]; tree.Create(a[i]); } tree.Inorder(); int m;cin>>m; while(m--){ int b;cin>>b; tree.Delete(b); tree.Inorder(); } } return 0; }
18.设二叉排序树中关键字由1至1000的整数构成,现要查找关键字为363的结点,下述关键字序列( )不可能是在二叉排序树上查找到的序列?
A)2,252,401,398,330, 344,397,363
B)924, 220, 911, 244, 898, 258, 362, 363
C)2, 399, 387, 219, 266, 382, 381, 278, 363
D)925, 202, 911, 240, 912, 245, 363
【答案】D