【问题标题】:Method to insert into a binary tree problem插入二叉树问题的方法
【发布时间】:2018-09-28 01:10:52
【问题描述】:

我在插入二叉树时遇到问题,以下代码似乎无法按我想要的方式工作。

  public static <E extends Comparable<? super E>>
                                   boolean inorderInsert(BTree<E> T, E x) {

   BTreeNode<E> n = T.getRoot();
    if(T.getRoot() == null) {
        T.setRoot(new BTreeNode<E>(x));
    }


 while (n != null) {
         if (x.compareTo(n.getElement()) == 0)
             return false;
         else if (x.compareTo(n.getElement()) < 0)
         if(n.getLeftChild()==null) {
             n.setLeftChild(new BTreeNode<E> (x));
         }
         if(n.getLeftChild()!=null) {
             n=n.getLeftChild();
         }
         else
         if(x.compareTo(n.getElement()) > 0) {
         if(n.getRightChild()==null) {
             n.setRightChild(new BTreeNode<E> (x));
         }
         if(n.getRightChild()!=null ) {
             n=n.getRightChild();
         }
         }
     } // while
    return true;

}

具有以下输入:

             10 3 8 4 10 5 5 18 19 13 

代码产生以下输出:

             3 4 5 13 18 19 8 10  

代替:

             3 4 5 8 10 13 18 19 10 

我正在考虑以某种方式制作一棵树,它会变成这样:

                         10
                      __/  \__
                     3         18                                                             
                      \       /  \
                       8     13  19                                               
                      /  
                     4
                      \ 
                       5

我找不到哪里出错了。任何帮助将不胜感激。

【问题讨论】:

  • 请在pastebin.comide.geeksforgeeks.org 上发布您的完整代码,因为我看不到上面的代码段试图做什么。
  • 上面的代码段正在获取输入中的值,它应该通过将第一个设置作为根,从这些值构造二叉树,然后构建其余的返回真值,其中如果它添加了它。如果它得到一个重复,它不会做任何事情,它只会返回 false,因为它没有插入值。我确信问题出在 if 语句的某个地方,但由于我的技能有限,我无法看到它。所有这些都需要在保持树有序的同时实现。
  • 你的意思是要制作二叉搜索树?
  • 是的,先生。我想这就是我要找的。​​span>
  • 从上面的代码中我可以推断出你在每次插入时也会将 o/p 设为 false。我可能猜错了,这完全取决于您所做的实现。所以请粘贴整个代码类,以便提供更广泛的图片。

标签: java methods binary-tree inorder


【解决方案1】:

当我检查代码时,我发现出了什么问题,这段代码产生了预期的结果。

    boolean inorderInsert(BTree<E> T, E x) {
    BTreeNode<E> n = T.getRoot();
    if(T.getRoot() == null) {
        T.setRoot(new BTreeNode<E>(x));
    }


    while (n != null) {
        if (x.equals(n.getElement()))                            
        return false;                                                             
else if (x.compareTo(n.getElement()) < 0)                  
        if (n.getLeftChild() == null) {                            
        n.setLeftChild(new BTreeNode<E>(x));                      
        return true;                                              
        }           
        else         
        n = n.getLeftChild();                                                                                                    
else  if (n.getRightChild() == null){                            
        n.setRightChild(new BTreeNode<E>(x));                   
        return true;                                               
        }
        else   
        n = n.getRightChild();                                  
        }
        return false;                                              
        }

【讨论】:

    【解决方案2】:

    从原始问题的 cmets 看来,您尝试做的是 Tree Sort,它通常更容易实现为递归算法,而不是迭代(while 循环)。我建议查看文献以了解有关该算法的更多信息。 上面代码目前的编写方式(迭代,即使用for循环),每次迭代只会让你遍历树的单个节点,使得得到的数据结构是线性的,即每个节点只会有一个孩子(换句话说,它相当于一个列表)。

    另外,我强烈建议正确缩进代码,因为这样可以更容易地理解代码分支到的确切位置。

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2019-08-30
      相关资源
      最近更新 更多