当前位置: 首页 > 知识库问答 >
问题:

树数据结构通常是根据节点或子树定义的吗?

巴宏恺
2023-03-14

我正在通过为Ruby编写树库来研究树遍历算法。就基本建筑而言,似乎有两个合理的选择;

  1. 只有树。树有根值和子树
  2. 存在树和节点。一个节点有一个值,子节点。树有根节点和子树。子树的根节点是树的根节点的子节点

其中一种设计更常见吗?在这个库的开发过程中,1)太幼稚或2)不必要的冗余会变得“明显”吗?本图书馆的预期用途为一般用途;我希望它可以用于巨树、二进制搜索树或解析树等。

我能想到其他不那么合理的建筑;

3) 树是节点的集合。树有一个根节点。节点有一个值和子节点。没有子树的概念。

4)如果我选择了一个只有节点的体系结构,我不能合理地问节点诸如“这棵树中有多少节点”或“平衡这棵树”。

共有1个答案

林英锐
2023-03-14

我从两个方面研究过树木。第一个是,只有节点具有属性(通常是数据引用、子引用,可能还有父引用)和行为。这很好用,因为没有单独的数据类型。但它也有缺点,因为空树由空节点表示。因此,您的代码中充满了以下内容:

if (tree == null)
    tree = node;
else
    tree.Insert(node);

检查null会导致代码难以读取。

不过,一个好处是,可以将任何节点视为一棵树。例如,你可以写:

tree.Right.CountNodes();

这将返回右子树的节点数。

因此,创建一个包含节点的数据结构。现在,节点只是数据,树具有行为。在内部,有一个根节点可以为null,行为必须处理它。但客户机代码只能写:

tree.Insert(node);

您仍然可以计算子树中的节点,不过:

tree.CountNodes(node);  // counts nodes in the subtree rooted at node

你使用哪种设计在很大程度上取决于风格。我发现更容易构建一个数据结构,从而抽象出处理节点之类的复杂问题。

 类似资料:
  • 问题内容: 我正在使用nltk的Tree数据结构来处理parsetree字符串。 但是,数据结构似乎受到限制。是否可以通过其字符串值获取节点,然后导航至顶部或底部? 例如,假设您要获取字符串值为 ‘nice’ 的节点,然后查看其父级,子级等是什么?可以通过nltk的Tree实现该节点吗? 问题答案: 对于NLTK 3.0,您想使用ParentedTree子类。 http://www.nltk.or

  • 我正在用python处理树,这就是我试图解决的问题。 我所有的节点都有列表。对于每个父母,通过一次删除一个元素,从父母列表中提取孩子的列表。 假设node1是列表1[1,2,3],我希望node1有3个子项(在本例中),其中每个子项都是通过每次删除一个项从列表1中提取的列表。所以node2=[2,3]node3=[1,3]和node4=[1,2] 我正在使用anytree库,但在复杂节点上找不到足

  • 本文向大家介绍数据结构中的点四叉树,包括了数据结构中的点四叉树的使用技巧和注意事项,需要的朋友参考一下 点四叉树是为表示二维点数据而实现的二叉树的改编。所有四叉树的特征由点四叉树共享。 在比较通常在O(log n)时间执行的二维有序数据点时,它通常非常有效。点四叉树的完整性值得一提,但kd树已超越它们成为广义二分搜索的工具。 点四叉树的构建如下。 给定下一个要插入的点,我们计算它所在的单元格并将其

  • 问题内容: 是否有一个良好的可用(标准Java)数据结构来表示Java中的树? 具体来说,我需要代表以下内容: 任何节点上的树都可以有任意数量的子代 每个节点(在根之后)只是一个字符串(其子代也是字符串) 我需要能够获得代表给定节点的输入字符串的所有子代(某种形式的列表或字符串数​​组) 是否有可用的结构或者我需要创建自己的结构(如果这样的话,实施建议会很好)。 问题答案: 这里: 那是可用于或任

  • 期望结果: 补充 结合边城用户的文章,最后得出的方法:

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?