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();
    }
}