[英]Binary tree insertion sort in C
嘿,谁能解释一下如何使用C语言中的插入排序来对二叉树进行排序,因为时间复杂度是一个问题。 我只是在学习编码。 感谢大伙们!
值得注意的是,这里有一些术语要使用。 二叉树是一种数据结构,其中每个节点最多具有两个子节点。 对于二叉树中的节点排序没有约定。
二进制搜索树是一种二进制树,因此对于给定的节点N,N的左子树中的所有节点都被视为“小于” N,N的右子树中的所有节点都被视为“大于”N。您也可以只要您一致地定义将它们放置在左侧子树或右侧子树中,就可以让节点在树中被视为“等于”N。
正如其他人所建议的,最好的办法是修改代码以构造二进制搜索树而不是普通的二进制树,或者将二进制树转换为线性数据结构并对其进行排序。
如果您以传统意义对二进制树进行编码,那么当您向树中添加项目时,它将保留排序的顺序。 您可以通过遍历树来按顺序获得项目的完整列表。 我建议您阅读:
#include <stdio.h>
#include <malloc.h>
#define FIN "algsort.in"
#define FOUT "algsort.out"
struct Node {
int val;
struct Node *left;
struct Node *right;
};
typedef struct Node node;
void insert(node **bt, node *Node) {
if( !(*bt) ) {
*bt = Node;
} else {
if( Node->val < (*bt)->val )
insert(&((*bt)->left), Node);
else
insert(&((*bt)->right), Node);
}
}
void printout(struct Node *node) {
if(node->left) printout(node->left);
printf("%d ", node->val);
if(node->right) printout(node->right);
}
void postorder(struct Node *node) {
if(node->left) printout(node->left);
if(node->right) printout(node->right);
printf("%d ", node->val);
}
int main () {
int i, n, elem;
node *curr;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
node *bt = NULL;
scanf("%d", &n);
for(i = 0; i < n; ++i) {
scanf("%d", &elem);
curr = malloc( sizeof(struct Node) );
curr->val = elem;
curr->left = NULL;
curr->right = NULL;
insert(&bt, curr );
}
printout( bt );
return(0);
}
假设algsort.in包含以下整数数组:
algsort.int-> 9,8,7,6,5,4,3,2,0,1,-1;
algsort.out-> -1,0,1,2,3,4,5,6,7,8,9
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.