题目描述:二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值; 2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值; 3. 左、右子树本身也是一颗二叉排序树。 现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
输入输出描述与样例:
输入包含多组测试数据,每组测试数据两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
input
5
2 5 1 3 4
output
-1 2 2 5 3
解题思路:
一开始为了解决自定义结构体的问题大费周折,后来加上typedef才解决。没加typedef的时候原编写的代码是可以在c++环境下编译成功的,而在c的环境下却不行。后来去查了一下typedef struct与struct在C++与C中的区分,等下把原因写在小困惑内。
建树的过程:
1、先找到新结点的位置(根结点单独处理):遍历树结点,按照左小右大原则查找最终的结点位置。
2、每次新建一个结点时将其孩子置空,data值赋值为输入的值。并且输出当前结点(即要插入结点的父亲)的值。
3、第一次输入的一定是根结点,直接输出-1即可。(如果要求建树后再输出,可以以在建树时建立一个“0”结点,0结点链接根结点,若结点的双亲是0则输出-1。)
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct BNode 4 { 5 struct BNode *lchild,*rchild; 6 int data; 7 } BNode,*tree; 8 void Insert(tree root,int x) 9 { 10 11 if(root->data>x) 12 { 13 if(root->rchild) Insert(root->rchild,x); 14 else 15 { 16 tree next=(tree)malloc(sizeof(BNode)); 17 next->data=x; 18 next->lchild=NULL; 19 next->rchild=NULL; 20 root->rchild=next; 21 printf("%d ",root->data); 22 } 23 } 24 else if(root->data<x) 25 { 26 if(root->lchild) Insert(root->lchild,x); 27 else 28 { 29 tree next=(tree)malloc(sizeof(BNode)); 30 next->data=x; 31 next->lchild=NULL; 32 next->rchild=NULL; 33 root->lchild=next; 34 printf("%d ",root->data); 35 } 36 } 37 } 38 39 int main() 40 { 41 int n,i,x; 42 while(scanf("%d",&n)!=EOF) 43 { 44 scanf("%d",&x); 45 tree root=(tree)malloc(sizeof(BNode));; 46 printf("-1 "); 47 root->data=x; 48 root->lchild=NULL; 49 root->rchild=NULL; 50 for(i=1;i<n;++i) 51 { 52 scanf("%d",&x); 53 Insert(root,x); 54 } 55 } 56 return 0; 57 }