【问题标题】:Insert node recursively递归插入节点
【发布时间】:2015-09-03 03:08:46
【问题描述】:

我正在尝试使用递归方法在二叉树中插入节点。但是一旦它退出方法,根就成为新节点,左孩子和右孩子都为空。有了这个,我试图了解递归是如何工作的。此外,递归方法是否总是必须返回一些东西。下面是代码。

public class BinaryNode {
     int key;
     BinaryNode left;
     BinaryNode right;

    public BinaryNode( int key){
        this.key = key;
       // this.left = left;
        //this.right = right;

    }
}

public class BinaryTree {

    BinaryNode root;


    public  void insert(int key){

        BinaryNode newNode = new BinaryNode(key);

            if(root == null){
                root = newNode;

            }else{
                  BinaryNode focusNode = root;
                  BinaryNode parent;

                while(true){
                    parent = focusNode;
                    if(key<focusNode.key){

                        focusNode = focusNode.left;
                        if(focusNode==null){
                            parent.left= newNode;
                            return;
                        }

                    }else{
                        focusNode = focusNode.right;
                        if(focusNode==null){
                            parent.right= newNode;
                            return;
                        }
                    }

                }

            }





    }

    public BinaryNode recursiveInsert(int key, BinaryNode node){
        BinaryNode newNode = new BinaryNode(key);
        if (node == null){
            root = newNode;

        }

        else{

            if(key < node.key){


                 root.left = recursiveInsert(key, node.left);


            }
            else{

                 root.right = recursiveInsert(key, node.right);


            }
        }

      return root;
    }




     public String toString(){
         String toTree = null;



        return toTree;
     }

    public static void main(String[]args){
        BinaryTree tree = new BinaryTree();

        tree.recursiveInsert(7, tree.root);
        tree.recursiveInsert(6, tree.root);
        tree.recursiveInsert(4, tree.root);
        tree.recursiveInsert(8, tree.root);
        tree.recursiveInsert(9, tree.root);
        tree.recursiveInsert(5, tree.root);



    }

}

我正在尝试的方法是递归插入。谢谢!!

【问题讨论】:

  • @LeonardoPugliese 我正在尝试递归地插入节点。我也做了迭代的方式。
  • @ilaunchpad 请接受适当的答案。

标签: java recursion binary-tree nodes


【解决方案1】:

你的递归代码应该是这样的:

public BinaryNode recursiveInsert(int key, BinaryNode node) {
    if (node == null) {
        return root = new BinaryNode<>(key);
    } else {
        if (key < node.key) {
            if (node.left == null) {
                return node.left = newNode;
            } else {
                return recursiveInsert(key, node.left);
            }
        } else {
            if (node.right == null) {
                return node.right = newNode;
            } else {
                return recursiveInsert(key, node.right);
            }
        }
    }
}

您正在对递归函数中的root 节点进行操作,您应该对传递给递归函数的node 进行操作。

【讨论】:

    【解决方案2】:

    这是因为您的 recursiveInsert 方法始终在 root 上运行。试试这个 -

    public Node recursiveInsert(Node currentParent, Node newNode) {
    
            if (currentParent == null) {
                return newNode;
            } else if (newNode.key > currentParent.key) {
                currentParent.right = recursiveInsert(currentParent.right, newNode);
            } else if (newNode.key < currentParent.key) {
                currentParent.left = recursiveInsert(currentParent.left, newNode);
            }
    
            return currentParent;
        }
    

    【讨论】:

      【解决方案3】:

      我想问题来自于

      if (node == null){
              root = newNode;
      }
      

      您正在遍历树,在最后一步中您正在询问叶节点的左/右子节点。这还没有,所以它的孩子是空的。 这是递归调用返回的值,最后,它被分配给 root。

      要解决这个问题,在下降到节点之前,请确保子节点存在。

      这也有点奇怪

      root.left = recursiveInsert(key, node.left);
      

      应该是node 而不是root

      【讨论】:

        【解决方案4】:

        您的代码有几个问题,我不一定会讨论,因为我认为它们会分散您对核心问题的注意力。

        首先回答您的第二个问题:不,没有规定递归方法必须返回任何内容。更重要的是他们知道何时终止。

        至于您的错误,我认为这可能是由于您的insert 方法总是返回并在root 上运行。您的意思可能是修改并返回newNode

        【讨论】:

        • 谢谢。如果您还可以指出还有什么问题,我将不胜感激。
        猜你喜欢
        • 2018-05-03
        • 1970-01-01
        • 2021-09-07
        • 2016-10-11
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        相关资源
        最近更新 更多