c - 有序二叉树插入

标签 c algorithm binary-tree

下面这段代码有问题,它是有序二叉树程序的一部分。问题是,当我在输入中输入数字时,一些元素就丢失了,而且它一直在发生。我查看了代码,无法弄清楚为什么会这样。你能帮我解决这个问题吗?谢谢。

void insert_ord(int number, struct treenode *currentNode){
   if(currentNode->flag == 0){
      currentNode->number = number;
      currentNode->flag = 1;                  
   }
   else{
      if(number <= currentNode->number){
         if(currentNode->left != NULL) insert_ord(number, currentNode->left);
         else {
            struct treenode *store = (struct treenode *)malloc(sizeof(struct treenode));
            currentNode->left = store;
            store->number = number;
            store->left = store->right = NULL;
            store->prev = currentNode;
         }
      }
      if(number > currentNode->number){
         if(currentNode->right != NULL) insert_ord(number, currentNode->right);
         else {
            struct treenode *store = (struct treenode *)malloc(sizeof(struct treenode));
            currentNode->right = store;
            store->number = number;
            store->left = store->right = NULL;
            store->prev = currentNode;
         }
      }
   }
}

最佳答案

您没有为新插入的节点设置 store->flag。大概应该设置为1。

您还应该重构您的代码,这样新节点的创建就不会重复 - 使用当前代码执行此操作的最简单方法是将其分离到一个新函数中:

struct treenode *new_node(struct treenode *parent, int number)
{
    struct treenode *store = malloc(sizeof(struct treenode));

    if (store) {
        store->number = number;
        store->left = store->right = NULL;
        store->prev = parent;
        store->flag = 1;
    }

    return store;
}

然后你的插入代码就变成了:

if (currentNode->left)
    insert_ord(number, currentNode->left);
else
    currentNode->left = new_node(currentNode, number);

(和右节点类似)。

关于c - 有序二叉树插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6247193/

相关文章:

binary-tree - 不使用递归的二叉树后序遍历

在C中创建右偏二叉树

c - 为什么getnameinfo()检索重复的地址?

algorithm - 在跳过列表中查找第 k 个元素 - 需要解释

c# - 如何将总数除以给定因素和下限?

algorithm - 编码单词列表的压缩算法

c++ - 递归地将元素插入二叉树

c++ - 为什么我的变量在 WaitForSingleObject 之后没有保持状态?

C、打印用户选择的月份

c - Linux 中的 C 线程同步