JAVA:创建二叉树的问题

时间:2012-03-11 20:23:56

标签: java binary-tree

好的,这是我的代码。我正在尝试用二叉树练习。为什么我的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));
    }
}
}

任何帮助都将不胜感激,明天我将有最后的信息!

萨姆

4 个答案:

答案 0 :(得分:2)

正如您在代码中的评论所说:

//remember to initialize a root

你没有这样做(至少在你的样本中)。

唯一的变量rootbTree的子类中定义,并且不能直接用于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());
  }
}

现在,请注意以下几点:

  1. 树只是一个节点。
  2. size是Node的实例方法。 (我的递归结构与静态结构有点不同,特别是在空检查的情况下)
  3. Node的唯一成员是value,left和right。我实际上并没有使用任何价值,如果没有访问者,就会有一些困难。
  4. 我对左和右的任务是在构造函数中,而不是在类声明中自由浮动。
  5. 从简单的事情开始。

    从这里开始,你可以声明一个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方法放在节点中。