二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值; 2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值; 3. 左、右子树本身也是一颗二叉排序树。 现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
输入描述:
输入包含多组测试数据,每组测试数据两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。
输出描述:
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
如:
输入:
5
2 5 1 3 4
输出:
-1
2
2
5
3
对于这种题,我脑子是懵的,得理清思路啊!
首先对于二叉排序树,最重要的莫过于输入的数x,正在比较的节点(先从根节点比较),若大于,放右边;若小于,放左边;但是还得时刻记录父亲节点,即目前正在比较又被抛弃了的节点。所以表示节点的结构体Tnode是必须的,然后就是艰难的插入函数,插入时要时刻记住父亲,并且到最后插完一个节点时,直接输出父亲的值,这样就OK啦。
代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct Tnode{
int data;
Tnode *lc;
Tnode *rc;
}Tnode;
Tnode* Insert(Tnode *T,int x,int father){
/*-------*/
if(T==NULL){//既是初始化,又是找到x对应位置后创建一个新节点放置x的值,因为在插入时不断地记录着父亲,所以这里插入时直接输出父亲
T=(Tnode*)malloc(sizeof(Tnode));//在这个地方犯了错,建立新节点是要在发现t=null后建立,而不是上面标记-----的地方,因为如果建立在那,就是一开始t指向的就是一个新的没有值的节点,根本进行不了比较插入操作。
T->lc=NULL;
T->rc=NULL;
T->data=x;
cout<<father<<endl;//同时在将新元素插入后及时输出father;
//return T;
//father=-1;
}
else if(T->data>x){
father=T->data;//父亲父亲父亲!!!别忘了赋值
T->lc=Insert(T->lc,x,father);//别忘了这里有返回值的
}
else{
father=T->data;
T->rc=Insert(T->rc,x,father);
}
return T;
}
int main()
{
int n;
int father;
int a[101];
int x;
while(cin>>n){
Tnode *T=NULL;
for(int i=0;i<n;i++){
cin>>x;
T=Insert(T,x,-1);//第一次输入的时候,将父亲当做-1,后续会不断调整的
//cout<<father<<" ";
}
}
return 0;
}
NOTE:
1 构造结构体完成后,一定要加分号;
2 定义结构体函数,注意返回值类型Tnode* ,return T;更得注意的是不要忘了分配空间T=(Tnode*)(malloc(sizeof(Tnode));
3树初始化为空值时,是Tnode *T=NULL;