按输入顺序建立二叉搜索树,并搜索某一结点,输出其父结点。
输入格式:
输入有三行:
第一行是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
提交结果:
思路分析:
创建树,查找元素,设置一个指针指向查找的结点的父节点。(这道题我自己写,提交全是段错误,然后喂给文心一言,给我改了一下,过了俩检查点,我自己在文心一言给出结果上面改,最后全过了,离谱!)
初始代码(段错误版):含有老师PPT代码
//
// Created by DDD on 2023/12/20.
//
#include <stdio.h>
#include <malloc.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode;
void Init(BiTNode *t,int x){
t->data = x;
t->rchild = NULL;
t->lchild = NULL;
}
BiTNode *insertNode(BiTNode *t,BiTNode *s){
BiTNode *p,*q;
if(t==NULL)
return s;
p = t;
while (p){
q = p;
if(s->data == p->data)
return t;
if(s->data < p->data)
p = p->rchild;
else p = p->rchild;
}
if(s->data<q->data)
q->lchild = s;
else q->rchild = s;
return t;
}
void Search(BiTNode *Head,int x){
BiTNode *p,*q;
p = Head;
if(Head == NULL){
printf("It does not exist.");
return;
}
if(Head->data == x) {
printf("It doesn't have parent.");
return;
}
while(p){
if(x == p->data){
printf("%d",q->data);
return;
}
q = p;
if(x>p->data)
p = p->rchild;
else p=p->lchild;
}
printf("It does not exist.");
}
int main(){
int n,x;
scanf("%d",&n);
BiTNode *SearchTree;
scanf("%d",&x);
Init(SearchTree,x);
for (int i = 0; i < n-1; ++i) {
scanf("%d",&x);
BiTNode *insert = (BiTNode *) malloc(sizeof(BiTNode));
Init(insert,x);
SearchTree = insertNode(SearchTree,insert);
}
scanf("%d",&x);
Search(SearchTree,x);
}
结果版代码:具有人工智能(人工+智能)的美感
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
} BiTNode;
void Init(BiTNode *t, int x) {
t->data = x;
t->lchild = t->rchild = NULL;
}
BiTNode *insertNode(BiTNode *t, BiTNode *s) {
if (t == NULL) {
t = (BiTNode *)malloc(sizeof(BiTNode));
Init(t, s->data);
return t;
}
if (s->data < t->data) {
t->lchild = insertNode(t->lchild, s);
} else if (s->data > t->data) {
t->rchild = insertNode(t->rchild, s);
}
else if(s->data == t->data){
return t;
}// If data is same, you may choose to insert or not, based on your requirements.
return t;
}
void Search(BiTNode *Head, int x) {
BiTNode *q;
if (Head == NULL) {
printf("It does not exist.\n");
return;
}
if (Head->data == x) {
printf("It doesn't have parent.\n");
return;
}
BiTNode *p = Head;
while (p) {
if (x == p->data) {
printf("%d\n", q->data);
return;
}
q = p;
if (x < p->data) {
p = p->lchild;
} else {
p = p->rchild;
}
}
printf("It does not exist.\n");
}
int main() {
int n, x;
scanf("%d", &n);
BiTNode *root = NULL; // Initialize the root as NULL. This will be our SearchTree.
scanf("%d", &x);
root = (BiTNode *)malloc(sizeof(BiTNode)); // Allocate memory for the root node.
Init(root, x); // Initialize the root node.
for (int i = 0; i < n - 1; ++i) {
scanf("%d", &x);
BiTNode *insert = (BiTNode *)malloc(sizeof(BiTNode)); // Allocate memory for the new node.
Init(insert, x); // Initialize the new node.
root = insertNode(root, insert); // Insert the new node into the binary search tree.
}
scanf("%d", &x);
Search(root, x);
free(root);
return 0;
}
return -1;