好的,这是我的代码。我正在尝试用二叉树练习。为什么我的size()方法不能访问二叉树的根节点?
我的root.left和root.right分配也不起作用。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.lang.*;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
System.out.println(bTree.size());
}
}
//Building Binary Trees
class bTree {
static class Node { //remember to initilize a root
String value;
Node left, right;
Node root = new Node("ROOT");
Node lefty = new Node("LEFT0");
Node righty = new Node("RIGHT0");
root.left = lefty;
root.right = righty;
Node(String value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
Node(String value) //THIS IS A SIBLING CONSTRUCTOR
{
this(value, null, null);
}
}
public static int size() //Public | sibling constructor
{
System.out.println("Debug0");
System.out.println(root.value);
return size(root);
}
//This method will find the size of a node
private static int size(Node r) //using recursion
{
if (r == null) {
return 0;
} else {
return 1 + (size(r.left) + size(r.right));
}
}
}
任何帮助都将不胜感激,明天我将有最后的信息!
萨姆
答案 0 :(得分:2)
正如您在代码中的评论所说:
//remember to initialize a root
你没有这样做(至少在你的样本中)。
唯一的变量root
在bTree
的子类中定义,并且不能直接用于size()
方法。
size()
应为:
public static int size() {
System.out.println("Debug0");
System.out.println(Node.root.value);
return size(Node.root);
}
答案 1 :(得分:2)
root
的范围是您的静态Node
类。 size()
超出了该范围,因此无法访问root
。
这样的事情会起作用:
public class TreeTraversal {
class Node {
String value;
Node left, right;
public Node(String value) {
this.value = value;
}
}
public static void main(String[] args) {
// Construct a binary tree
Node root = new Node("root");
Node child = new Node("child 1");
root.left = child;
child = new Node("child 2");
root.right = child;
// Find its size
System.out.println(size(root));
}
private static int size(Node root) {
return sizeRec(root);
}
private static int sizeRec(Node r) {
if (r == null) {
return 0;
} else {
return 1 + (sizeRec(r.left) + sizeRec(r.right));
}
}
}
答案 2 :(得分:1)
这是二叉树的一种浓缩版本。我试图去除所有不必要的东西(嵌套类,额外的导入,除了main,嵌套静态类,递归对象构造之外的静态方法)。
public class Node {
private String value;
private Node left;
private Node right;
public Node(String value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
public int size() {
int ret = 1;
if (left != null) ret += left.size();
if (right != null) ret += right.size();
return ret;
}
public static void main(String args[]) {
Node tree = new Node("root",
new Node("left", null, null),
new Node("right", null, null));
// expect 3
System.out.println(tree.size());
}
}
现在,请注意以下几点:
从简单的事情开始。
从这里开始,你可以声明一个BTree类(但为什么呢?它只是练习嵌套类吗?)。它将包含一个名为root的节点和一个只调用root的size方法的size方法。
你可以声明一个不需要孩子的好构造函数。然后,您可能还希望在节点上提供方法以在构造之后设置子节点。
放松并专注于最终的具体问题。找到其他练习题,然后重试。吃得健康,休息一下。然后,祝你好运。
答案 3 :(得分:0)
要访问bTree
中的root,您需要编写Node.root
。
您的Node是一个顶级类(阅读有关静态内部类的信息)。因此你的代码
public static int size() //Public | sibling constructor
{
System.out.println("Debug0");
System.out.println(root.value);
return size(root);
}
不起作用,您需要创建根节点。
此外,我认为你的定义
Node root = new Node("ROOT");
在Node中没有必要,除非你想从每个节点返回一个根节点,我觉得有点难看:-0
最后,为什么要使用课程bTree
?您可以使用以n为根的树来标识节点n。即将size
方法放在节点中。