繁体   English   中英

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

[英]Why is the recursive insertion method of the BST not working

我编写了以下代码,以实现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);
    }
}

在您的insertNode()方法中,您只是在创建一个新节点。 您永远不会将新创建的节点添加到其父节点。 您应该检查是否要在此处插入,或者应该返回新返回的节点并进行相应的设置。

如果您不希望与当前程序有太大差异,可以进行以下更改。

public void insertNode(TreeNode node, int key) {     
   if (node.getKey() > key) {
       if (node.left == null) { //check if you want to insert the node here
           TreeNode newNode = new TreeNode(key);
           node.left = newNode;
       } else {
            insertNode(node.getChildLeft(), key);
       }
   } else if (node.getKey() < key) {
       if(node.right == null){ //check if you want to insert the node here
            TreeNode newNode = new TreeNode(key);
            node.right = newNode;    
        } else {
             insertNode(node.getChildRight(), key);
        }
   } else {
         // don't do anything
   }
}

在Java中,参数是通过值传递的。 insertNode ,如果您对node不执行任何其他操作,则行node = new TreeNode(key); insertNode 不会做任何有用的事情。

在树中插入的典型实现通过返回将替换前一个节点的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;
}

再进一步,以前的方法实际上应该是private public方法应如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM