我正在尝试构建一个二叉树,在那里我将获得每个节点的父节点和左/右节点。我理解如何遍历树,但我不知道如何使用我给定的信息来构建它。
我最不确定如何在保持彼此关系的同时组装节点,我觉得链接列表可能是我需要实现的,但我对它们的理解感到不稳定。
非常感谢任何澄清或见解。
答案 0 :(得分:0)
最简单的方法是让每个节点都拥有对其父节点以及左右子节点的引用。像这样:
class Node{
private Node parent;
private Node left;
private Node right;
// getters, setters...
}
通过这种方式,您可以将一堆节点耦合在一起,这些节点更像是双向图形(即您可以从任何所需的节点开始遍历它)。
您还可以创建一个Tree
类来管理节点。
class Tree{
private Node root;
public Tree(Node root){
this.root = root;
}
public void addLeftChild(Node parent, Node leftChild){
leftChild.parent = parent;
parent.left = leftChild
}
//methods to traverse tree and so on...
}
请注意,这是一个非常简单的例子,可以做什么,实际上不会编译,但它可能会指向你制作自己的树。
答案 1 :(得分:0)
如果你知道它将是一个完整的二叉树,那么最有效的方法就是使用数组实现;但是,它对于非完整的二叉树来说并不好。在这种情况下,一个简单的方法是定义BinaryNode
,如下所示:
public BinaryNode(BinaryNode parent, BinaryNode leftChild,
BinaryNode rightChild, Object data)
{
this.parent = parent;
this.leftChild = leftChild;
this.rightChild = rightChild;
this.data = data;
}
如果您知道树的给定实例化只有一种总体数据类型,那么您可以将上面的定义更改为基于泛型的定义。如果不是,则data
必须是Object
。
如有必要,您可以创建一个可以存储树根的BinaryTree
类,但请注意每个BinaryNode
都是“BinaryTree
”。
这里的关键见解是BinaryNode
对象本身就足以完全存储树结构。当然,您需要实现addNode()
,removeNode()
等,但这个简单的结构定义了我们想要的关系,并导致直观的递归方法定义。
根据您需要执行的操作类型,您很可能实际上不需要在parent
中存储node
属性。