C中的二叉树插入排序

时间:2013-02-21 23:28:08

标签: c data-structures recursion tree binary-tree

嘿,任何人都可以解释如何使用C语言中的插入排序对二叉树进行排序,其中时间复杂性是一个问题。我只是在学习编码。谢谢你们!

3 个答案:

答案 0 :(得分:1)

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

二进制搜索树是二叉树,因此对于给定节点N,N的左子树中的所有节点被认为是“小于”N,并且右子树中的N的所有节点都是被认为是“大于”N.您也可以让节点在树中被认为“等于”N,只要您始终将它们定义为放在左子树或右子树中。

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

答案 1 :(得分:0)

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

另请查看:http://nova.umuc.edu/~jarc/idsv/lesson1.html

答案 2 :(得分:0)

#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 - &gt; 9,8,7,6,5,4,3,2,0,1,-1;

algsort.out - &gt; -1,0,1,2,3,4,5,6,7,8,9