当前位置: 首页 > 知识库问答 >
问题:

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

司寇高峯
2023-03-14

我编写了以下代码来实现BST的递归插入方法。但是当我以遍历顺序打印树时,它会在插入之前打印原始树。似乎没有插入元素。请帮帮我。提前谢谢。另外,请建议更改代码。顺便说一下,初始树的遍历顺序是2 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);
    }
}

共有2个答案

向苗宣
2023-03-14

在Java中,参数按值传递。在插入节点中,如果您不使用节点执行任何其他操作,则行节点=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);
}
赏阳嘉
2023-03-14

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
   }
}
 类似资料:
  • 编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。 我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码: 最终返回的是

  • 出于某种原因,我一直在试图编译这段代码时出错,但似乎一切都正常,对吗? 导入java。util.*;公共类平方根{public static void input(){

  • 我创建了一个二叉查找树类。我创建了我的插入方法、高度方法和打印方法。当我插入时,一切看起来都很好。如果根为空,我创建一个新的根并设置该项目。但是当我调用我的高度方法时,它打印出2而不是1。当我调用print方法时,它会两次打印出包括root在内的所有元素。例如,我按以下顺序插入了以下元素:9, 5, 4, 55, 555 当我调用PREorderPRINT方法时,它会输出:9, 5, 4, 9,

  • 我试图插入二叉查找树使用递归,然后打印它预先使用这个特定的代码,但我只有根作为输出,为什么?这是因为每个时间栈(每次调用后)弹出从而删除新节点?这是一个java代码)

  • 我写了一个到达基本情况的方法(我可以告诉你,因为它打印了print语句),但是它会循环返回null(在方法的结尾)。为什么我的方法没有在基本情况下停止? 编辑:此外,如果一个对象不存在于我的BST中,它不会返回null。我得到了一个空指针异常,这是不应该发生的,因为或语句