为什么BST的递归插入方法不起作用

时间:2015-08-15 17:44:58

标签: java recursion data-structures insert binary-search-tree

我编写了以下代码来实现BST的递归插入方法。但是当我按照顺序打印树时,它会在插入之前打印原始树。好像没有插入元素。请帮帮我。提前致谢。另请注明代码更改。顺便说一下,步行顺序中的初始树是2 5 5 6 7 8。

package DataStructures;

class TreeNode {
    private TreeNode parent;
    private TreeNode childLeft;
    private TreeNode childRight;
    private int key;

    public TreeNode(){

    }

    public TreeNode(int key) {
        this(key, null);
    }

    public TreeNode(int key, TreeNode parent) {
        this(key, parent, null, null);
    }

    public TreeNode(int key, TreeNode parent, TreeNode childLeft, TreeNode childRight) {
        this.key = key;
        this.parent = parent;
        this.childLeft = childLeft;
        this.childRight = childRight;
    }

    public int getKey() {
        return key;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public TreeNode getParent() {
        return parent;
    }

    public void setParent(TreeNode parent) {
        this.parent = parent;
    }

    public TreeNode getChildLeft() {
        return childLeft;
    }

    public void setChildLeft(TreeNode childLeft) {
        this.childLeft = childLeft;
    }

    public TreeNode getChildRight() {
        return childRight;
    }

    public void setChildRight(TreeNode childRight) {
        this.childRight = childRight;
    }
}

public class BinarySearchTreeBasicTest {
    private static class BinarySearchTree {
        private TreeNode root;
        private TreeNode maxNode = new TreeNode(0);

        public BinarySearchTree(TreeNode root) {
            this.root = root;
        }

        public void printTheTreeInOrderWalk(TreeNode x) {
            if (x != null) {
                printTheTreeInOrderWalk(x.getChildLeft());
                System.out.print(x.getKey() + " ");
                printTheTreeInOrderWalk(x.getChildRight());
            }
        }









        public void insertNode(TreeNode node, int key){
            if (node == null){
                node = new TreeNode(key);
            }
            else{
                if (node.getKey() > key){
                    insertNode(node.getChildLeft(), key);
                } else if (node.getKey() < key){
                    System.out.println("k");
                    insertNode(node.getChildRight(), key);
                } else{
                    // dont do anything
                }
            }
        }
    }

    public static void main(String[] args) {
        TreeNode rootNode = new TreeNode(6);
        BinarySearchTree tree = new BinarySearchTree(rootNode);
        TreeNode node1 = new TreeNode(5);
        TreeNode node2 = new TreeNode(7);
        rootNode.setChildLeft(node1);
        rootNode.setChildRight(node2);
        node1.setParent(rootNode);
        node2.setParent(rootNode);
        TreeNode node3 = new TreeNode(2);
        TreeNode node4 = new TreeNode(5);
        node1.setChildLeft(node3);
        node1.setChildRight(node4);
        node3.setParent(node1);
        node4.setParent(node1);
        TreeNode node5 = new TreeNode(8);
        node5.setParent(node2);
        node2.setChildRight(node5);
        tree.insertNode(rootNode, 3);
        tree.printTheTreeInOrderWalk(rootNode);
    }
}

1 个答案:

答案 0 :(得分:0)

在Java中,参数按值传递。在insertNode中,如果您对node不做任何其他操作,则行node = new TreeNode(key);将无法执行任何有用的操作。

树中插入的典型实现方法是返回将替换前一个的TreeNode

private TreeNode insertNode(TreeNode node, int key){
    if (node == null){
        node = new TreeNode(key);
    }
    else{
        if (node.getKey() > key){
            node.setChildLeft(insertNode(node.getChildLeft(), key));
        } else if (node.getKey() < key){
            node.setChildRight(insertNode(node.getChildRight(), key));
        } else{
            // dont do anything
        }
    }
    return node;
}

更进一步,前一个方法应该是privatepublic方法应如下所示:

public void insertNode(int key){
    root = insertNode(root, key);
}