我的二叉树插入逻辑的缺陷在哪里?

Posted

技术标签:

【中文标题】我的二叉树插入逻辑的缺陷在哪里?【英文标题】:Where is the flaw in my binary tree insertion logic? 【发布时间】:2017-01-30 03:13:38 【问题描述】:

我的解决方案是这样的

/*
Node is defined as 

typedef struct node

   int data;
   node * left;
   node * right;
node;

*/


node * insert (node * root, int value)

   bool inTreeAlready = false;
   node * cur = root;
   while(cur != NULL)
   
       if(cur->data < value)
           cur = cur->right;
       else if(cur->data > value)
           cur = cur->left;
       else
       
           inTreeAlready = true;
           break;
       
   
   if(!inTreeAlready)
   
       cur = new node; 
       cur->data = value;
       cur->left = NULL;
       cur->right = NULL;
      
   return root;

问题提示说明您应该在插入后返回树的根。

这显然是错误的,因为输出是

Wrong Answer!
Some possible errors:
1. You returned a NULL value from the function. 
2. There is a problem with your logic
3. You are printing some value from the function

这不是很具有描述性。

我已经仔细检查了我的逻辑,但不知道交易是什么。

【问题讨论】:

我看到您创建了一个新节点,但我没有看到您实际上将它链接到树。从root 无法访问它 - 它只是泄露了。如果您从一棵空树 (root == NULL) 开始,那么您显然也会以一棵空树结束(root 仍然是 NULL) - 所以您甚至永远不会进入第一个节点。 奇怪的是这段代码打印了一些东西,因为它没有任何printf 调用。 【参考方案1】:

您没有将新节点添加到树中。这是修改后的版本。

node * insert (node * root, int value)

   bool inTreeAlready = false;
   node * cur = root;
   node *parent;
   bool right;
   while(cur != NULL)
   
       parent = cur;
       if(cur->data < value)
       
           cur = cur->right;
           right = true;
       
       else if(cur->data > value)
       
           cur = cur->left;
           right = false;
       
       else
       
           inTreeAlready = true;
           break;
       
   
   if(!inTreeAlready)
   
       cur = new node; 
       cur->data = value;
       cur->left = NULL;
       cur->right = NULL;
       if(root == NULL) root = cur;
       else if(right) parent->right = cur;
       else parent->left = cur;
      
   return root;
 

【讨论】:

想想我本可以在 C# 中用 5-7 行代码完成这一切,哈哈。一定喜欢 C++。 @user7127000 究竟在“5-7 行”中做什么?无论使用哪种语言,您对代码的问题是您完全没有将新节点与树链接起来。如果没有代码,任何语言都不会神奇地使节点成为树的一部分。 @user7127000 我可以将其设为一行(当然,其中包含几个分号)。 ;-) 只是在开玩笑。我同意使用一种语言完成一项任务似乎很复杂,但使用另一种语言可能会非常简单。 顺便说一下,这个解决方案在其中一个测试用例上出现了分段错误 @user7127000 再简单看一下代码,如果 root 为 NULL 就会有问题。所以我修改了代码。希望这能解决您遇到的问题。

以上是关于我的二叉树插入逻辑的缺陷在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树:总结篇!(需要掌握的二叉树技能都在这里了)

二叉树的基本操作实现

用于在 JavaScript 中的二叉树中插入节点的递归函数中的错误

史上最详细的二叉树B树,看不懂怨我

数据结构 第5章 树的二叉树 单元小结遍历二叉树和线索二叉树

判断两个二叉树是否相同