【问题标题】:Ordered Binary Tree insert有序二叉树插入
【发布时间】:2011-06-06 01:55:58
【问题描述】:

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

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;
         }
      }
   }
}

【问题讨论】:

  • 不是所有的二叉树都是有序的吗?
  • 是的,你是什么意思?
  • "我在下面的代码中有问题,它是有序二叉树程序的一部分。" - “有序”部分是多余的
  • @Mitch Wheat:不,我认为你的意思是二进制堆不是有序的。您还可以将二叉树用作“连接结构”,其中顶点处的值不以任何方式排序。
  • @Mitch:对不起,我从你的问题中假设你假设二叉树是完全有序的。堆是部分有序的,而连接树是无序的。

标签: c algorithm binary-tree


【解决方案1】:

您没有为新插入的节点设置store-&gt;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);

(右节点类似)。

【讨论】:

    【解决方案2】:

    malloc 返回未初始化的内存,并且您没有初始化 malloced 结构的标志字段。

    【讨论】:

    • 这不是@Caf 13 分钟前发布的内容吗?
    • @Mitch,差不多。我点击提交时没有看到 Caf 的回复。
    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2011-06-22
    相关资源
    最近更新 更多