Java中特定的树形数据结构

3

我正在尝试在Java中实现一种特定的树形数据结构,但我不确定这是什么类型的树。以下是我尝试执行的示例:

             -----------------------------
            | Board                       |
            |
            | Node1  Node2  Node3  Node4  |
            |   _      _      _      _
            |  |_|    |_|    |_|    |_|   |
             ---+------+------+------+----
                |      |      |      |
               /       |      |       \
 --------------       ---    ---     -----------
| Board        |       -      -     | Board     |
|                                   |           
| Node1  Node2 |                    | Node1 ... |
|   _      _                        |   _       
|  |_|    |_|  |                    |  |_|  ... |
 ---+------+---                      ---+------+ 
   /       |                            |
   .       .                            .
   .       .                            .
   .       .                            .

因此,我创建了两个类:BoardNode

  • Each Board consists of an ArrayList of Nodes:

    public class Board {
        ArrayList<Node> mContent;
    
        Board() {
            mContent = new ArrayList<Node>();
        }
    
        Board(Board pBoard) {
            mContent = new ArrayList<Node>(pBoard.mContent);
        }
    
        void add(Node pNode) {
            mContent.add(pNode);
        }
    
        void add(String pString, Board pBoard) {
            Node tNode = new Node(pString, pBoard);
            mContent.add(tNode);
        }
    }
    
  • Each Node consists of a String and a reference to another Board:

    public class Node {
        String mLabel;
        Board mBoard;
    
        Node(){
            mLabel = new String();
            mBoard = null;
        }
    
        Node(String pLabel, Board pBoard){
            mLabel = new String(pLabel);
            mBoard = new Board(Board);
        }
    
        void setBoard(Board pBoard){
            mBoard = pBoard;
        }
    }
    
我的问题是:
  • add(Node pNode)方法中,我需要创建一个新的Node,然后将其添加到ArrayList中吗?

  • setBoard(...)方法中,我需要创建一个新的Board,然后将其传递给mBoard,还是只需执行mBoard = pBoard就可以了?

  • 如何表示叶子节点?我尝试用null进行初始化,但是却得到了NullPointerException

谢谢!

1
由于您的父子关系是在节点板上,因此您应该从节点到板对象实现指针。如果没有这个结构就会悬空。 - Roam
1
这里的Board的目的有点令人困惑。通常,树中的节点由一个名为Node的类表示,该类包含对需要保存的数据的引用以及对其子节点和父节点的引用。即考虑将Board合并到Node中。 - Trevor Freeman
@increment1 - 我应该如何保留对父级“Board”的引用?通过将父级作为构造函数的参数传递吗? - horta
1
是的,通常就是这样做。如果节点可以移动,则还需要为其设置/获取器。 - Trevor Freeman
@increment1 - 太好了,我现在就会实现它们,感谢你的帮助。 - horta
显示剩余2条评论
1个回答

4
回答你的问题:
  • 应使用作为参数传递的Node,不需要创建新的节点。
  • 应使用作为参数传递的Board,不需要创建新的棋盘。
  • 叶节点具有空的mBoard。或者它可以有一个具有空mContent数组的mBoard。选择取决于您未发布有关如何让树底部的信息。
你可能需要考虑简化你的结构。不清楚为什么你不只有一个Node类(mBoard字段替换为ArrayList<Node> mContent字段)。

非常感谢您的快速帮助!实际上,为了构建树形结构,这些“节点”将来自另一个类中的“ArrayList source”。如果我在树形结构中更改其内容(例如:更改“Node”的“String mLabel”),那么原始“Node”也会受到影响吗?(来自“ArrayList source”的节点) - horta
折叠结构看起来更加简洁,即使在我的原始代码中Board类有其他属性(在发布之前我试图让它更简单)。 - horta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接