二叉排序树
题目截图:
思路:
参照我的另一篇博客。
代码如下:
1 /*
2 二叉排序树
3 */
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <math.h>
8 #include <stdlib.h>
9 #include <time.h>
10 #include <stdbool.h>
11
12 // 二叉树结构体
13 typedef struct _node {
14 int data; // 数据域
15 struct _node* left; // 左子树
16 struct _node* right; // 右子树
17 } node;
18
19 // 在以 root 为根结点中插入结点 x,pre 储存父结点
20 void insert(node** root, node* pre, int x) {
21 if((*root) == NULL) { // 若根结点为空,表示已经找到插入位置
22 // 新建结点
23 node* newNode = (node*)malloc(sizeof(node));
24 newNode->data = x;
25 newNode->left = newNode->right = NULL;
26 (*root) = newNode; // 插入结点
27 if(pre == NULL) { // 输出父结点
28 printf("-1");
29 } else {
30 printf("%d", pre->data);
31 }
32 return;
33 }
34 if(x == (*root)->data) { // 树中已经有该结点
35 return;
36 } else if(x < (*root)->data) { // 值小于根结点的值,应插到左子树
37 insert(&(*root)->left, *root, x);
38 } else { // 值大于根结点的值,应插到右子树
39 insert(&(*root)->right, *root, x);
40 }
41 }
42
43 int main() {
44 int N, i, x;
45 scanf("%d", &N); // 结点个数
46 node* root = NULL;
47 for(i=0; i<N; ++i) {
48 scanf("%d", &x);
49 insert(&root, root, x); // 插入结点
50 if(i != N-1) { // 格式化输出
51 printf("\n");
52 }
53 }
54
55 return 0;
56 } 