【问题标题】:Insert method not working Binary Tree java插入方法不起作用二叉树java
【发布时间】:2014-11-28 03:37:13
【问题描述】:

不是 BinarySearchTree,只是普通的二叉树。

这是我的 RegularTree 类:

public class RegularTree extends BinaryTree {

    public RegularTree() {
        super();
    }

    public void insert(Comparable item) {
        if(this.isEmpty()) {
            this.setRoot(new TreeNode(item));
            return;
        }

        TreeNode t = this.getRoot();
        while(t != null) {
            if(t.getLeft() == null)
                t.setLeft(new TreeNode(item));
            else if(t.getRight() == null)
                t.setRight(new TreeNode(item));
            else {
                if(size(t.getLeft()) > size(t.getRight()))
                    t = t.getRight();
                else
                    t = t.getLeft();
            }
        }
    }

    public int size(TreeNode node) {
        return(getSize(node));
    }

    private int getSize(TreeNode node) {
        if (node == null)
            return(0);
        else
            return(getSize(node.getLeft()) + 1 + getSize(node.getRight()));
    }

    public TreeNode find(Comparable key) {
        TreeNode p = this.getRoot();
        while(p != null && key.compareTo(p.getValue()) != 0) {
            if(key.compareTo(p.getValue()) < 0)
                p = p.getLeft();
            else
                p = p.getRight();
        }
        return p;
    }

    public void inorder() {
        doInorderTraversal(this.getRoot());
    }

    private void doInorderTraversal(TreeNode t) {
        if(t != null) {
            doInorderTraversal(t.getLeft());
            System.out.print(t.getValue() + " ");
            doInorderTraversal(t.getRight());
        }
    }

}

这是我的主要方法:

public static void main(String[] args) {
    RegularTree tree = new RegularTree();
    tree.setRoot(new TreeNode(1));
    tree.insert(2);
    tree.insert(3);
    tree.insert(4);
    tree.insert(5);
    tree.insert(6);
    tree.inorder();
}

这应该会创建一个如下所示的树:

                1
              /   \
            2       3
           / \     / 
         4    5   6

tree.inorder() 应该对树进行中序遍历,这意味着它应该打印出 4 2 5 1 6 3

但是,当我运行我的 main 方法时,什么也没有发生。我认为我的插入方法有问题,但我不确定是什么问题。

【问题讨论】:

  • 可能还有其他问题,但我认为在插入方法中你应该在调用 t.set{Left,Right} 后退出循环
  • 我按照你说的做了,树现在正在插入。但是,我的 inorder() 方法打印出以下数字: 4 2 6 1 5 3 出于某种原因,5 和 6 出现在错误的位置。我认为 inorder() 方法没有问题,因为它适用于我的 BinarySearchTree。

标签: java insert binary-tree


【解决方案1】:

正如我在上面的评论中提到的,您应该在调用 set{Left,Right} 后返回。我刚刚测试了你的代码中的修改,我得到了 4 2 5 1 6 3 正如你所期望的。

我没有修改您代码中的任何其他内容。

我在下面包含了修改后的版本:

public class BinaryTree {

TreeNode root;


public int size(TreeNode node) {
    return(getSize(node));
}

private int getSize(TreeNode node) {
    if (node == null)
        return(0);
    else
        return(getSize(node.getLeft()) + 1 + getSize(node.getRight()));
}

public void insert(Comparable item) {
    if(this.getRoot() == null) {
        this.setRoot(new TreeNode(item));
        return;
    }

    TreeNode t = this.getRoot();
    while(t != null) {
        if(t.getLeft() == null) {
            t.setLeft(new TreeNode(item));
            return;
        }
        else if(t.getRight() == null) {
            t.setRight(new TreeNode(item));
            return;
        }
        else {
            if(size(t.getLeft()) > size(t.getRight()))
                t = t.getRight();
            else
                t = t.getLeft();
        }
    }
}





public TreeNode getRoot() {
    return root;
}

public void setRoot(TreeNode root) {
    this.root = root;
}

public void inorder() {
    doInorderTraversal(this.getRoot());
}

private void doInorderTraversal(TreeNode t) {
    if(t != null) {
        doInorderTraversal(t.getLeft());
        System.out.print(t.getValue() + " ");
        doInorderTraversal(t.getRight());
    }
}

public static void main(String[] args) {
    BinaryTree tree = new BinaryTree();
    tree.setRoot(new TreeNode(1));
    tree.insert(2);
    tree.insert(3);
    tree.insert(4);
    tree.insert(6);
    tree.insert(5);
    tree.inorder();

}
  }

【讨论】:

  • 对不起,那是因为我的插入操作不正确。 5应该在6之前插入。由于某种原因,它交换了5和6的位置。
  • 为什么你认为这是不正确的?不管顺序如何,你仍然得到一棵二叉树。
猜你喜欢
  • 2016-01-21
  • 2018-10-16
  • 2016-05-09
  • 1970-01-01
  • 2012-08-21
  • 2020-08-22
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多