繁体   English   中英

C中的二叉树插入排序

[英]Binary tree insertion sort in C

嘿,谁能解释一下如何使用C语言中的插入排序来对二叉树进行排序,因为时间复杂度是一个问题。 我只是在学习编码。 感谢大伙们!

值得注意的是,这里有一些术语要使用。 二叉树是一种数据结构,其中每个节点最多具有两个子节点。 对于二叉树中的节点排序没有约定。

二进制搜索树是一种二进制树,因此对于给定的节点N,N的左子树中的所有节点都被视为“小于” N,N的右子树中的所有节点都被视为“大于”N。您也可以只要您一致地定义将它们放置在左侧子树或右侧子树中,就可以让节点在树中被视为“等于”N。

正如其他人所建议的,最好的办法是修改代码以构造二进制搜索树而不是普通的二进制树,或者将二进制树转换为线性数据结构并对其进行排序。

如果您以传统意义对二进制树进行编码,那么当您向树中添加项目时,它将保留排序的顺序。 您可以通过遍历树来按顺序获得项目的完整列表。 我建议您阅读:

还可以看看: http : //nova.umuc.edu/~jarc/idsv/lesson1.html

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM