Java二进制搜索树实现问题。!

时间:2012-02-25 17:44:03

标签: java algorithm binary-tree

我正在用java开发一个二叉搜索树。但我面临一些困难。这是代码

class Node {

    Node left, right;
    Integer data;

    Node(Integer d, Node left, Node right) {
        this.data = d;
        this.left = left;
        this.right = right;
    }
}

class BinaryTree {

    Node root;

    public BinaryTree(Node root) {
        this.root = root;
    }

    void insert(int d)
    {
        if(root==null)
            root= new Node(d, null, null);
        insert(root,d);
    }
    void insert(Node root, int d) {
        if (root == null) {
            root=new Node(d,null,null);
        } else if (d > root.data) {
            insert(root.right, d);
        } else if (d < root.data) {
            insert(root.left, d);
        }
    }

    void inorder(Node root) {
        if (root != null) {
            inorder(root.left);
            System.out.println(root.data);
            inorder(root.right);
        }
    }
}

public class BST {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        BinaryTree bt=new BinaryTree(null);
        while (!(str = br.readLine()).equalsIgnoreCase("0")) {
            bt.insert(Integer.parseInt(str));
        }
        bt.inorder(bt.root);
    }
}

我面临的问题是在java中只有值传递。我在每种情况下都将root作为null,除了我已经将新创建的根传递给它的第一种情况。这里当我通过传递root的左边或右边的值来对insert函数进行递归调用时,然后在新调用中创建了新根,如果需要它,但是当函数超过它时#s; s值不会反映到调用者函数的变量中。 简而言之,问题是由于值跟随java的调用。

有人可以为这个问题建议解决方案吗?

2 个答案:

答案 0 :(得分:4)

您对insert(root.right/left, d)的调用如果它们为空,则不会更改原始的右/左节点,只需将方法参数指向一个新变量(正如您所注意到的那样)在Java中不会改变原始引用)。您对第一个根的更改是有效的,因为您调用了另一种方法insert(int)

您是否考虑过制作左右BinaryTree而不是Node?此外,不要使用“null”,而应考虑使用“空”BinaryTree(使用空根和isEmpty方法)。

请注意,概念,左右是树,而不是节点,因此设计会更清晰。


示例代码。未经测试但这个想法应该是正确的:

class Node {

    BinaryTree left, right;
    Integer data;

    Node(Integer d, BinaryTree left, BinaryTree right) {
        this.data  = d;
        this.left  = left;
        this.right = right;
    }
} 

class BinaryTree {

    Node root;

    // Empty tree
    BinaryTree() {
        this(null);
    }

    BinaryTree(Node root) {
        this.root == root;
    }

    void insert(int d) {

        if (this.root == null) {

            // The tree was empty, so it creates a new root with empty subtrees
            this.root = new Node(d, new BinaryTree(), new BinaryTree());

        } else if (d > this.root.data) {
            this.root.right.insert(d);
        } else if (d < this.root.data) {
            this.root.left.insert(d);
        }
    }
}

注意:

  • 我尊重现有代码的风格。
  • 此实现将跳过重复的元素。

答案 1 :(得分:1)

建议,

  • 如果您想使用Integer值,我不会使用int
  • 如果您正在复制JVM中的代码,我会首先阅读代码的工作方式(并复制您需要的代码)
  • 当我的代码中有错误时,我会使用调试器来解决出错的问题。
  • 我从一个最简单的单元开始,它可以显示问题,并修复了这种简单的情况。

我会发布最简单的单元测试,任何人都可以重现,以及你在调试器中看到的内容,如果它没有任何意义。

这并没有真正回答你的问题,但是评论太长了。 ;)