【问题标题】:Node class for binary tree. Getting stackoverflow error二叉树的节点类。获取stackoverflow错误
【发布时间】:2017-04-04 14:27:57
【问题描述】:

我在我的节点类中遇到了树数据结构的 Stackoverflow 错误。我知道原因,但我似乎无法解决它。

public class Node {
    Node right;
    Node left;
    String element;
    Node parent;

    public Node(){  
        right = new Node();
        left = new Node();
    }
}

因为我在构造函数中构造了新节点,所以我得到了堆栈溢出。如何构造我的构造函数并避免此错误?

【问题讨论】:

  • 嗯,不要那样做?当您说Node node = new Node(); 时,您希望leftright 的值做什么
  • 我知道你在哪里弄糊涂了。只需将 left 和 right 保留为空。当您决定实际添加一个节点到您的树时,您可以将那里的值初始化为new Node() :)

标签: java data-structures nodes


【解决方案1】:

您可以在节点实际存在时按需创建它们。

public class Node {
    Node left, right; // created as required
    String element;
    Node parent;

    public Node(Node parent, String element) {
        this.parent = parent;  
        this.element = element; // if you don't have an element you don't need a Node.
    }
}

注意:很可能您不需要 parent 字段,大多数实现不使用它。

public class Node {
    Node left, right; // created as required
    String element;

    public Node(String element) {
        this.element = element; // if you don't have an element you don't need a Node.
    }

    public void setLeft(Node left) { this.left = left; }
    public void setRight(Node right) { this.right = right; }
}

例如

 Node d = new Node("d");
 d.setLeft(new Node("a"));
 d.setRight(new Node("z"));

【讨论】:

  • 我只是好奇。你说父字段没有实现很多。如果一个节点是在没有父节点的情况下实现的,你如何确定一个节点是否有父节点?还有你如何确定根节点?
  • @SedrickJefferson 通常从树的根而不是其中的随机节点开始。从根开始,您知道它下面的每个节点都有一个父节点以及它的父节点是什么。
  • 可悲的是,我在学习编程时并没有在我的数据结构课上投入太多精力,而且我再也没有回去掌握这些概念。我想我现在明白了。这是一个简单的节点,可用于实现其他想法,如简单链表、双向链表或循环链表。
  • @SedrickJefferson 每个数据结构都有一个节点,该节点具有适合该数据结构的字段。这些结构都不需要parent 字段。
  • 感谢您的课程!我要回去掌握数据结构。
【解决方案2】:

您应该删除递归构造函数调用,如下所示。

    public Node(){  
        right = null;
        left = null;
    }

应该通过从类外部或通过 getter 和 setter 函数分配子级来完成特定树的组装。

【讨论】:

    【解决方案3】:

    不要在其构造函数中 new Node 本身,它永远不会结束,直到堆栈溢出或堆内存不足,你可以这样做:

    • leftright 传递给构造函数:

    代码:

    public class Node {
        Node right;
        Node left;
        String element;
        Node parent;
    
        public Node(Node left, Node right){  
            this.left = left;
            this.right = right;
        }
    }
    
    • setter:

    代码:

    public class Node {
        Node right;
        Node left;
        String element;
        Node parent;
    
        public Node(){  
        }
    
       public void setLeft(Node left) {
           this.left = left;
       }
    
    
       public void setRight(Node right) {
           this.right = right;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多