Data structures 遍历二叉树-无递归、无堆栈、无树修改
因此,对于我正在构建的应用程序,我需要能够遍历二叉树,而无需在树创建后使用递归、堆栈或以任何方式修改树。我的节点结构如下所示:Data structures 遍历二叉树-无递归、无堆栈、无树修改,data-structures,graph,tree,binary-search-tree,traversal,Data Structures,Graph,Tree,Binary Search Tree,Traversal,因此,对于我正在构建的应用程序,我需要能够遍历二叉树,而无需在树创建后使用递归、堆栈或以任何方式修改树。我的节点结构如下所示: typedef struct { ValueType value; //Data stored in node int left_index; //Left child int right_index; //Right child int parent_index; //Parent node } 我将树存储为一维数组,其中每
typedef struct
{
ValueType value; //Data stored in node
int left_index; //Left child
int right_index; //Right child
int parent_index; //Parent node
}
我将树存储为一维数组,其中每个节点的左子节点位于索引2*I+1,右子节点位于索引2*I+2,父节点位于[I-1]/2。如果节点没有父节点或子节点,则其关联索引为-1
我发现的唯一一种迭代的非堆栈算法是Morris Traversal,如图所示:
然而,Morris Traversal在遍历过程中修改了树,这是我无法做到的
我愿意向每个节点添加所需的任何信息,只要我能够在上述约束条件下编写算法
我所要求的可能吗?如果是这样的话,我该怎么做呢?甚至不知道如何开始 一会儿也不会!循环是否足够?您想要的是一个循环。所有叶节点的右指针都指向节点的顺序后续节点
创建这样的东西很容易,在插入或删除节点时更新它一点也不困难。如果您可以控制节点结构,那么这几乎肯定就是您想要的。有很多关于无需额外操作即可遍历树的研究。但是,第一个额外删除的人是父指针。有了它,人们可以随心所欲地在树上漫步,让一切变得简单。
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode parent;
public void traverse() {
TreeNode current = this.leftMost();
while (current != null) {
System.out.println("Current at " + current.val);
current = current.inOrderNext();
}
}
public TreeNode inOrderNext() {
if (right != null) {
return right.leftMost();
} else {
TreeNode current = this;
TreeNode above = this.parent;
while (true) {
if (above == null) {
return null;
} else {
if (above.left == current) {
return above;
} else {
current = above;
above = above.parent;
}
}
}
}
}
public TreeNode leftMost() {
TreeNode result = this;
while (result.left != null) {
result = result.left;
}
return result;
}
public static void main(String args[]) {
TreeNode first = new TreeNode();
first.val = 4;
TreeNode second = new TreeNode();
second.val = 2;
second.parent = first;
first.left = second;
TreeNode third = new TreeNode();
third.val = 1;
third.parent = second;
second.left = third;
third = new TreeNode();
third.val = 3;
third.parent = second;
second.right = third;
second = new TreeNode();
second.val = 6;
second.parent = first;
first.right = second;
third = new TreeNode();
third.val = 5;
third.parent = second;
second.left = third;
third = new TreeNode();
third.val = 7;
third.parent = second;
second.right = third;
first.traverse();
}
}