二叉排序树

二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值