【问题标题】:add node to binary search tree recursively with errors递归地将节点添加到二叉搜索树,但有错误
【发布时间】:2018-08-01 15:44:37
【问题描述】:

我已经创建了一个向我的二叉搜索树添加新项目的方法,我不知道我有什么问题,但它没有向我的树添加任何内容...我将附加我的 BTNode 类和我的 add 方法.我真的很感激一些帮助/建议。

    public class BTNode
{
  public int item;
  public BTNode left;
  public BTNode right;

  public BTNode(int i, BTNode l, BTNode r)
  {
    item = i;
    left = l;
    right = r;
  }

  public String toString() 
  {
    return "[" + item + "]";
  }

}

//添加方法

public BTNode add (BTNode node, int value)
    {
        if (node == null)
        {
            node = new BTNode(value, null, null);
            return node;
        }
        else if (node.item > value)
            node.left = add(node.left, value);
        else if (node.item < value)
            node.right = add(node.right, value);

        return node;

    }

//测试人员

public static void main(String[] args) {
        BinarySearchTree tree = new BinarySearchTree();

        BTNode root = new BTNode(70, null, null);
        BTNode n2   = new BTNode(20, null, null);
        BTNode n3   = new BTNode(10, null, null);
        BTNode n4   = new BTNode(27, null, null);
        BTNode n5   = new BTNode(150, null, null);
        BTNode n6   = new BTNode(115, null, null);
        BTNode n7   = new BTNode(300, null, null);
        root.left  = n2;
        root.right = n5;
        n2.left    = n3;
        n2.right   = n4;
        n5.left    = n6;
        n5.right   = n7;


        tree.add(root,32);


    }

【问题讨论】:

  • error 到底是什么?
  • 当尝试使用 add 方法时,它不会向我已经创建的树添加任何内容...
  • 你怎么知道它不会改变树?没有对树或输出的查询?将有助于包含一些显示错误的代码。
  • @AlexDelgado 抱歉耽搁了。刚刚更新了fix 并做了一些修改。

标签: java recursion binary-search-tree


【解决方案1】:

我认为问题出在以下几行:

    if (node == null)
    {
        node = new BTNode(value, null, null);
        return node;
    } else if (xxx)

您必须将其更改为:

    if (node == null)
    {
        node = new BTNode(value, null, null);
        if(this.item>value) {
            left = node;
        } else {
            right = node;
        }
        return node;
    } else if (xxx)

【讨论】:

    【解决方案2】:

    根据您的main,我假设add 方法属于BinarySearchTree 类。

    您的 add 方法可以正常工作,但您必须显示树才能看到它是否有效。

    例如,如果您修改 BTNodetoString() 方法以显示给定节点的子树的所有节点:

    public String toString() 
    {
        StringBuilder sb = new StringBuilder();
        if (left != null) {
            sb.append (left.toString ());
        }
        sb.append ("[" + item + "]");
        if (right != null) {
            sb.append (right.toString ());
        }
        return sb.toString ();
    }
    

    您会看到打印root 节点:

    System.out.println (root);
    

    在所有节点中产生结果,包括您使用tree.add(root,32); 添加的节点:

    [10][20][27][32][70][115][150][300]
    

    add 方法的一个小问题是,如果树中已经存在具有相同值的节点,它将不会添加新节点。我不知道这是否是预期的行为。

    【讨论】:

      【解决方案3】:

      如果我是你,我会将add 封装到add(int val) 中的BinarySearchTree 中,这是一个演示:

      public class BinarySearchTree {
          private BTNode root;
      
          public static void main(String[] args) {
              BinarySearchTree tree = new BinarySearchTree();
      
              tree.add(70);
              tree.add(20);
              tree.add(10);
              tree.add(27);
              tree.add(150);
              tree.add(115);
              tree.add(300);
              System.out.println(tree.toString());
          }
      
          @Override
          public String toString() {
              return root.toString();
          }
      
          public void add(int value) {
              root = add(root, value);
          }
      
          private BTNode add(BTNode node, int value) {
              if (node == null) {
                  return new BTNode(value, null, null);
              }
              if (node.item > value)
                  node.left = add(node.left, value);
              else if (node.item < value)
                  node.right = add(node.right, value);
              return node;
          }
      
          static class BTNode {
              int item;
              BTNode left;
              BTNode right;
      
              BTNode(int i, BTNode l, BTNode r) {
                  item = i;
                  left = l;
                  right = r;
              }
      
              @Override
              public String toString() { // return the pre-order traversal;
                  StringBuilder stringBuilder = new StringBuilder();
                  if (left != null) stringBuilder.append(left.toString());
                  stringBuilder.append("[" + item + "]");
                  if (right != null) stringBuilder.append(right.toString());
                  return stringBuilder.toString();
              }
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        • 2016-07-31
        相关资源
        最近更新 更多