sdut 2128 排序二叉树的中序遍历

本文介绍如何根据给定顺序建立排序二叉树并输出中序遍历结果。通过C语言实现,包括节点创建、插入及遍历等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树结构练习——排序二叉树的中序遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。
 

输入

输入包含多组数据,每组数据格式如下。
第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)
第二行包含n个整数,保证每个整数在int范围之内。

输出

为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。
 

示例输入

1
2
2
1 20

示例输出

2
1 20
View Code
 1 #include<stdlib.h>
 2 #include<stdio.h>
 3 typedef struct node
 4 {
 5     int data;
 6     struct node *l, *r;
 7 }tree;
 8 int n;
 9 void build(tree *head, int x)
10 {
11     tree *p;
12     if(head ->data > x)
13     {
14         if(head ->l == NULL)
15         {
16             p = (tree *)malloc(sizeof(tree));
17             p -> data = x;
18             p -> l = NULL;
19             p -> r = NULL;
20             head -> l = p;
21         }
22         else
23         {
24             build(head->l, x);
25         }
26     }
27     else
28     {
29         if(head -> r == NULL)
30         {
31             p = (tree *)malloc(sizeof(tree));
32             p -> data = x;
33             p -> l = NULL;
34             p -> r = NULL;
35             head -> r = p;
36         }
37         else
38         {
39             build(head->r, x);
40         }
41     }
42 }
43 void midtravel(tree *head)
44 {
45     if(head)
46     {
47         midtravel(head -> l);
48         if(n > 1)
49         {
50             printf("%d ",head->data);
51             n --;
52         }
53         else printf("%d",head -> data);
54         midtravel(head -> r);
55     }
56     else
57     return;
58 }
59 int main()
60 {
61     int i, a;
62     tree *head;
63     head = (tree *)malloc(sizeof(tree));
64     while(scanf("%d",&n) != EOF)
65     {
66         for(i = 0; i < n; i ++)
67         {
68             scanf("%d",&a);
69            if(i == 0)
70            {
71                head ->data = a;
72                head ->l = NULL;
73                head ->r = NULL;
74            }
75            else
76            {
77                build(head,a);
78            }
79         }
80         midtravel(head);
81         printf("\n");
82     }
83     return 0;
84 }

 

转载于:https://www.cnblogs.com/wanglin2011/archive/2012/07/26/2609477.html

### 山东理工大学 SDUT 排序算法实现及问题解决方案 #### 1. 背景介绍 关于山东理工大学(SDUT)在线评测系统的排序问题,存在特定背景下的挑战。某些题目不仅考察基本的编程能力还涉及到对特殊条件的理解处理[^1]。 #### 2. 特殊情况说明 有部分题目属于特判题型,在实际比赛中可能遇到异常状况使得常规解法失效或者出现意想不到的结果。例如曾经发生过的服务器故障导致即使提交空白代码也能通过测试的情况[^2]。 #### 3. 解决方案概述 针对上述提到的问题以及更广泛的排序需求,下面提供一种通用而有效的Python实现方法来完成字符统计任务,附带去除重复项的功能: ```python def remove_duplicates(student_list): seen = set() unique_students = [] for student_info in student_list: if student_info not in seen: unique_students.append(student_info) seen.add(student_info) return unique_students if __name__ == "__main__": students = [ '张三', '李四', '王五', '张三' ] result = remove_duplicates(students) print(result) ``` 这段程序能够有效地移除列表中的任何重复条目保持原始顺序不变。它适用于处理像学生名册这样的数据集,其中可能存在冗余记录需要清理[^5]。 #### 4. 性能考量 当考虑算法性能时,除了时间效率外还需要关注空间消耗。对于递归操作而言,尽管单次调用所需额外内存有限,但由于栈帧累积效应可能导致整体开销增加至O(log n),这取决于具体应用场景和输入规模[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值