Build A Binary Search Tree

根据给定的节点结构和整数键序列,唯一地填充这些键到二叉树中,使得树满足二叉搜索树的定义。输出满足条件的树的层次遍历序列。
摘要由CSDN通过智能技术生成
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
  • Both the left and right subtrees must also be binary search trees.

Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤\le100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format left_index right_index, provided that the nodes are numbered from 0 to N-1, and 0 is always the root. If one child is missing, then -1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.

Output Specification:

For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.

Sample Input:

9
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
73 45 11 58 82 25 67 38 42

Sample Output:

58 25 82 11 38 67 45 73 42
result:
#include<stdio.h>
#include<stdlib.h>
typedef struct TNode* Tree;
struct TNode
{
 int Key;
 int Node;
 Tree Left;
 Tree Right;
};
void inorder(Tree head,int* a);
void invisit(Tree head,int* a);
int anum=0;
int main (void)
{
 int num;
 int i,j;
 int f,l;
 int *a;
 int *n;
 int k;
 int min;
 int temp;
 Tree* head;
 Tree* level;
 scanf("%d",&num);
    head=(Tree*)calloc(sizeof(Tree*),(num));
 level=(Tree*)calloc(sizeof(Tree*),(num));
 for(i=0;i<num;i++)
 {
  head[i]=(Tree)malloc(sizeof(struct TNode));
  head[i]->Left=NULL;
  head[i]->Right=NULL;
  head[i]->Key=i;
 }
 for(i=0;i<num;i++)
 {
  scanf("%d%d",&l,&f);
  if(l!=-1)
   head[i]->Left=head[l];
  if(f!=-1)
   head[i]->Right=head[f];
 }
 a=(int*)calloc(sizeof(int),(num));
 inorder(head[0],a);
 anum--;
 n=(int*)calloc(sizeof(int),(num));
 for(i=0;i<num;i++)
 {
  scanf("%d",&k);
  n[i]=k;
 }
 for(j=0;j<num;j++)
 {
  min=j;
  for(i=j;i<num;i++)
  {
   if(n[i]<n[min])
    min=i;
  }
  temp=n[j];
  n[j]=n[min];
  n[min]=temp;
 }
 for(i=0;i<num;i++)
 {
  head[a[i]]->Node=n[i];
 }
 level[0]=head[0];
 f=0;
 l=1;
 while(f!=l)
 {
  if(level[f]->Left!=NULL)
  {
   level[l]=level[f]->Left;
   l++;
  }
  if(level[f]->Right!=NULL)
  {
   level[l]=level[f]->Right;
   l++;
  }
  f++;
 }
 printf("%d",level[0]->Node);
 for(i=1;i<num;i++)
 {
  printf(" %d",level[i]->Node);
 }
 return 0;
}
void inorder(Tree head,int* a)
{
 if(head==NULL)
  return ;
  inorder(head->Left,a);
  invisit(head,a);
  inorder(head->Right,a);
}
void invisit(Tree head,int* a)
{
 a[anum]=head->Key;
 anum++;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值