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 }
  • 相关阅读:
    ArcGIS Engine获取单条要素的标注(LABEL)内容
    推荐一个winform第三方控件QIOS DevSuite
    解决C#,CAD二次开发实例化AcadApplicationClass失败
    skyline中屏蔽或自定义InformationWindow和NavigationMap的右键菜单
    (转)Skyline TEPro6.0版本在二次开发方面的改进总结
    skyline TEP 6 开发帮助文档CHM中文汉化版
    CCIE一年后的心语(转)
    PC 到 PC的共享
    Mysql 更改某一字段的内容为另一字段加上字符串
    Ralis: 连接数据库并查询
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/8305065.html
Copyright © 2011-2022 走看看