Algorithm 为什么';它不会终止吗? var m_root:Node=root 私有def插入(键:Int,值:Int):节点={ if(m_root==null){ m_root=节点(键、值、空、空) } 变量t:Node=m_根 变量标志:Int=1 while(t!=null&&flag==1){ if(key==t.key){ T } 否则如果(键

Algorithm 为什么';它不会终止吗? var m_root:Node=root 私有def插入(键:Int,值:Int):节点={ if(m_root==null){ m_root=节点(键、值、空、空) } 变量t:Node=m_根 变量标志:Int=1 while(t!=null&&flag==1){ if(key==t.key){ T } 否则如果(键,algorithm,scala,syntax,Algorithm,Scala,Syntax,我编写了迭代版本,在二叉搜索树中插入一个节点。我想在创建节点时终止,但它并没有停止,因为我想我并没有指定终止条件。如何编辑代码以在插入节点时终止?我不确定您想要什么行为,但原因很清楚 您的循环是一个while条件,它将循环直到t为null。因此,当t为非空时,循环将继续 您只能将t赋值给非空值-事实上,您专门检查空值情况,并通过创建一个新节点来阻止它的发生 因此,您需要重新考虑循环条件,或者确保t在某些情况下确实变为null,这取决于您实际的算法要求 由于您在底部返回t,我建议while条件是错

我编写了迭代版本,在二叉搜索树中插入一个节点。我想在创建节点时终止,但它并没有停止,因为我想我并没有指定终止条件。如何编辑代码以在插入节点时终止?

我不确定您想要什么行为,但原因很清楚

您的循环是一个
while
条件,它将循环直到
t
null
。因此,当
t
为非空时,循环将继续

您只能将
t
赋值给非空值-事实上,您专门检查空值情况,并通过创建一个新节点来阻止它的发生

因此,您需要重新考虑循环条件,或者确保
t
在某些情况下确实变为null,这取决于您实际的算法要求

由于您在底部返回
t
,我建议while条件是错误的;唯一可能的终止方法是如果
t
此时为null,那么无论如何返回它都是没有意义的。

循环中“if”语句的第一个子句

  var m_root : Node = root
  private def insert(key: Int, value: Int): Node = {
        if(m_root == null) {
            m_root = Node(key, value, null, null)
        }
        var t : Node = m_root
        var flag : Int = 1
        while (t != null && flag == 1) {
            if(key == t.key) {
                t
            }
            else if(key < t.key) {
                if(t.left == null) {
                    t.left = Node(key, value, null, null)
                    flag = 0
                } else {
                    t = t.left
                }

            } else {
                if(t.right == null) {
                    t.right = Node(key, value, null, null)
                    flag = 0
                } else {
                    t = t.right
                }
            }
        }
      t
 }

。。。如果比较结果为真,则什么也不做。它不会终止循环。这里的语句
t
returnt
不是同义词。您可以在该点设置
flag=0
,以终止循环。

我编辑了我的代码,这激发了您的评论,但它不能自行终止。@Jaehyun(基于您的编辑)-考虑在节点已经存在的常见情况下会发生什么。在第一个
if
块中的终止情况下,您没有正确地将
标志设置为零,因此在这一点上,当
循环时,它仍将围绕
旋转。此外,我同意dave4420的观点,即这应该是一个名称更好的
布尔
标志。此外,由于您现在有一个确定是否继续的标志,因此没有理由也包括
t!=空
检查您的
而不检查
条件。“二叉搜索树的侮辱”?非常同意。在风格方面:如果您将
标志
重命名为
carryOn
,并使其成为一个布尔变量,最初为
true
,但在终止循环时为其分配了
false
,则代码会稍微清晰一些。
if(key == t.key) {
    t
}