7-1 建立二叉搜索树并查找父结点 (48分)
按输入顺序建立二叉搜索树,并搜索某一结点,输出其父结点。
输入格式:
输入有三行: 第一行是n值,表示有n个结点; 第二行有n个整数,分别代表n个结点的数据值; 第三行是x,表示要搜索值为x的结点的父结点。
输出格式:
输出值为x的结点的父结点的值。 若值为x的结点不存在,则输出:It does not exist. 若值为x的结点是根结点,则输出:It doesn’t have parent.
输入样例:
2
20
30
20
输出样例:
It doesn't have parent.
输入样例:
2
20
30
30
输出样例:
20
答案样例:
#include<iostream>//创作不易,点个赞吧
using namespace std;
int flag=0;//用来标记是否查找成功了
typedef struct BSTNode {//结点结构体
int data;
BSTNode *lchild,*rchild;
} BSTNode,*BSTree;
void InsertBST(BSTree &T,int e ) {//插入元素
if(!T) {//树为空就造一个
BSTree S = new BSTNode;
S->data =e;
S->lchild = S->rchild = NULL;
T=S;
} else if (e < T->data )//小就放到左子树
InsertBST(T->lchild,e);
else if (e > T->data )//大就放到右子树
InsertBST(T->rchild,e);
}
void CreateBST(BSTree &T ) {//建树
int i=1,n;
cin >> n;
T=NULL;
int e;
while(i<=n) {
cin>>e ;
InsertBST(T, e);
i++;
}
}
void SearchBST(BSTree P, BSTree &T, int find) {//查找
if(T->data == find) {
cout << P->data;
flag = 1;
return ;
} else if(find<T->data && T->lchild!=NULL) {
SearchBST(T, T->lchild, find);
return ;
} else if(find>T->data && T->rchild!=NULL) {
SearchBST(T, T->rchild, find);
return ;
}
}
int main() {
int find;
BSTree T;
CreateBST(T);
cin >> find;
if(T->data == find) {//如果根节点就是要找的点直接输出无父节点
cout << "It doesn't have parent." << endl;
return 0;
}
SearchBST(NULL, T, find);
if(flag == 0)//如果没有找元素到则输出元素不存在,
//一开始还判断了如果树是否为空,因为树空也说明找不到元素,
//不过加不加这个条件并不影响做题,因为树空就失去了查找的意义
cout << "It does not exist." << endl;
return 0;
}//创作不易,点个赞吧
这里结构体、建树、插入元素的函数借用于填空题程序,并且对结构体进行了简化,去掉了key,直接使用data当作结点元素,我将填空题的程序也放在下面:(包括填空题答案)
#include<iostream>//创作不易,点个赞吧,新春快乐~
using namespace std;
typedef struct ElemType {
int key;
} ElemType;
int flag=1;
typedef struct BSTNode {
ElemType data;
BSTNode *lchild,*rchild;
} BSTNode,*BSTree;
void InsertBST(BSTree &T,ElemType e ) {
if(!T) {
BSTree S = new BSTNode;
S->data =e;
S->lchild = S->rchild = NULL;
T=S;
} else if (e.key< T->data.key)
InsertBST(T->lchild,e);
else if (e.key> T->data.key)
InsertBST(T->rchild,e);
}
void CreateBST(BSTree &T ) {
int i=1,n;
cin >> n;
T=NULL;
ElemType e;
while(i<=n) {
cin>>e.key;
InsertBST(T, e);
i++;
}
}
void InOrderTraverse(BSTree &T) {
if(T) {
InOrderTraverse(T->lchild);
if(flag) {
cout<<T->data.key;
flag=0;
} else cout<<" "<<T->data.key;
InOrderTraverse(T->rchild);
}
}
int main() {
BSTree T;
CreateBST(T);
InOrderTraverse(T);
return 0;
}//创作不易,点个赞吧
感谢您的阅读,点个赞吧❤⭐
哔哩哔哩/bilibili:羊卓的杨
公众号:羊卓的杨