zoukankan      html  css  js  c++  java
  • 二叉排序树输出爸爸

    题目描述:二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 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 }
  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/8305065.html
Copyright © 2011-2022 走看看