假设我在一棵树中有一个节点,我如何获得所有的叶节点,它们的祖先是这个节点?我这样定义了TreeNode:
public class TreeNode<T>
{
/** all children of the node */
private List<TreeNode<T>> children = new ArrayList<TreeNode<T>>();
/** the parent of the node, if the node is root, parent = null */
private TreeNode<T> parent = null;
/** the stored data of the node */
private T data = null;
/** the method I want to implement */
public Set<TreeNode<T>> getAllLeafNodes()
{
Set<TreeNode<T>> leafNodes = new HashSet<TreeNode<T>>();
return leafNodes;
}
}
创建堆栈并推送根节点。
Stack<Node> st = new Stack<>();
st.push(root);
CL(st.peek());
调用递归方法。
public void CL(Node root){
if (st.peek().left == null && st.peek().right == null ) {//if leaf node
System.out.println(st.peek().data);//print
st.pop();
return;
}
else{
if(st.peek().left != null){
st.add(st.peek().left);
CL(st.peek());
}
if(st.peek().right != null){
st.add(st.peek().right);
CL(st.peek());
}
}
st.pop();
}
使用递归。
类似这样的东西(未测试):
public Set<TreeNode<T>> getAllLeafNodes() {
Set<TreeNode<T>> leafNodes = new HashSet<TreeNode<T>>();
if (this.children.isEmpty()) {
leafNodes.add(this);
} else {
for (TreeNode<T> child : this.children) {
leafNodes.addAll(child.getAllLeafNodes());
}
}
return leafNodes;
}
我有一个可能很大的根树结构,我想将其转换为矩阵,是树中的叶子数量,是树中度数大于1的节点数量,即根节点和内部节点。矩阵应按如下方式填充: mi, j = { 如果叶有祖先,1否则 例如,这棵树: 将转换为此矩阵: 由于树木可能会变得非常大(可能约为100,000片叶子),我想知道是否有一种比为每个叶子节点遍历树更聪明/更快的方法。感觉某种算法在某个地方遇到了这个问题,但我还没有弄清楚。也许有人可以
给定一棵二叉树,问题是找到所有根到叶的路径。我们通过以列表的形式传递路径,并在到达叶子时将其添加到结果中来了解算法。 我的问题是存储所有路径需要多少空间。我的直觉是,每条路径将消耗树高度(O(h))的内存顺序,如果我们的完整二叉树中有2*n-1个节点,那么每个节点对应于一条路径,因此假设树高度平衡,空间复杂度将为O(n*log(n))。我的分析正确吗?
所以我有两到三棵树,它们是在执行一些代码时生成的。此树的每个节点都有一个属性,即它至少有0个子节点,最多有8个子节点。我猜你可以得到这样一个完整的树的图片,在0级有一个根节点。在1级8个节点在2级64个节点,以此类推。父节点的每个子节点的编号从0到7,我在java中将其存储为字节整数类型,顺便说一句,我在java中实现了这一点。 现在我需要合并这两到三棵树,我已经生成,我这样做的水平明智完全不考虑
我有一棵看起来像上面的树,由一个链接结构表示: 我的目标是找到从根节点到叶节点的所有路径。 我的树遍历算法如下所示: 当我运行它时,我确信树正在按图所示构建。我已经测试过了。然而,我无法找出我的树遍历分割错误的原因。 我得到的输出是: 我已经在高度较小的树上测试了它,它是有效的。但是出于某种原因,它不适用于高度大于2的树。我认为这是树出了问题,我检查并打印了每个父级、左子级和右子级,它们打印出来如
假设给定一组树ST,每棵树的每个顶点都被标记。另外还给出了另一棵树T(也有顶点标签)。问题是如何找到ST的哪些树可以从T的根开始跨越树T,从而使生成树T的顶点标签与T的顶点标签一致。请注意,T的每个顶点的子节点要么完全覆盖,要么根本不覆盖——不允许部分覆盖子节点。换句话说:给定一棵树和以下过程:选择一个顶点,删除该顶点以下的所有顶点和边(除了顶点本身)。找到ST的那些树,这样每棵树都是用一系列应用
我目前正在尝试实现一个树(不是二进制的,顺序不重要,不是定向的)数据结构。当一棵树的根与另一棵树的子节点相同时,我希望将树合并在一起 第一棵树的子树应该成为第二棵树的子树,第二棵树的子树与第一棵树的根相同。要合并的树可能更深。 我实现了像这样: 然后我有一个树列表