Java 三元搜索树-迭代遍历

Java 三元搜索树-迭代遍历,java,algorithm,Java,Algorithm,我试图以迭代方式遍历三元搜索树。我尝试使用与二叉搜索树相同的技术遍历它,保留一个堆栈,push一个节点,pop它,以及push它的子节点 这样,所有节点都会被访问,但我不确定如何跟踪树包含的字符串 我有一个用于遍历的递归代码: public void traverse(TernaryTreeNode r, String str) { if (r != null) { traverse(r.left, str);

我试图以迭代方式遍历
三元搜索树。我尝试使用与二叉搜索树相同的技术遍历它,保留一个堆栈,
push
一个节点,
pop
它,以及
push
它的子节点

这样,所有节点都会被访问,但我不确定如何跟踪树包含的字符串

我有一个用于遍历的递归代码:

public void traverse(TernaryTreeNode r, String str)
    {
        if (r != null)
        {
            traverse(r.left, str);

            str = str + r.data;
            if (r.isEnd)
                al.add(str);

            traverse(r.middle, str);
            str = str.substring(0, str.length() - 1);

            traverse(r.right, str);
        }
    }
我希望重写一个迭代实现。 这是当前代码:

public void iterativePreorder(TernaryTreeNode node) {

        // Base Case
        if (node == null) {
            return;
        }

        // Create an empty stack and push root to it
        Stack<TernaryTreeNode> nodeStack = new Stack<TernaryTreeNode>();
        nodeStack.push(root);
        String str = "";

        while (nodeStack.empty() == false) {

            // Pop the top item from stack and print it
            TernaryTreeNode mynode = nodeStack.peek();
            nodeStack.pop();
            str+= mynode.data;
            if(mynode.isEnd){
                al.add(str); //al is an ArrayList of strings
            }

            // Push right and left children of the popped node to stack
            if (mynode.right != null) {
                nodeStack.push(mynode.right);
            }

            if (mynode.middle != null) {
                nodeStack.push(mynode.middle);
            }
            else{
                str = "";
            }

            if (mynode.left != null) {
                nodeStack.push(mynode.left);
            }


        }

    } 
以下是一个可视示例:

您可以考虑保留另一个<强>堆栈以跟踪父字符串,或者使用配对的类使用相同的<强>堆栈

class TernaryPair {
  TernaryTreeNode node;
  String fromParent;
}
根元素以空字符串放入堆栈。每当您将字符串推入堆栈时,您也会从父级推入该字符串

TernaryPair mypair = nodeStack.pop();
str+= mypair.fromParent + mypair.node.data;
if(mypair.node.isEnd){
  al.add(str); //al is an ArrayList of strings
}
当推到堆栈时

if (mypair.node.right != null) {
  TernaryPair newPair = new TernaryPair();
  newPair.node = mypair.node.right;
  newPair.fromParent = str;
  nodeStack.push(newPair);
}
PS:
Stack pop()
方法将删除并返回堆栈顶部的元素。一个电话就够了

TernaryTreeNode mynode = nodeStack.peek();
nodeStack.pop();
-->


到底是什么跟踪了树包含的字符串的含义?正如我看到的,您正在将所有节点的字符串连接到单个字符串。如果这是您想要的,那么代码有什么问题?也
str=”“
看起来可疑,也许这就是问题所在?@NikolayKondratyev跟踪字符串-->基于isEnd属性,我能够知道当前节点是否表示字符串的结尾,因此我将str添加到arraylist。isEnd可以是叶节点,也可以不是叶节点。因此,在添加一个字符串之后,我必须在某个地方重新初始化以获得其他字符串。我无法在代码中定义该逻辑。那么我想您只需要移动
str=“”
al.add(str)。你去抛出一棵树,如果节点标记为
isEnd
,你需要将字符串添加到列表中,同时将当前字符串
str
重置为空字符串。@NikolayKondratyev我不确定你是否知道三元搜索树的功能,但在这种情况下,这不起作用,因为字符串还包含其他字符串,例如,AB和ABBA,一旦我到达AB,我就不能重新初始化str,因为我还需要让ABBADo不“累积”
String
s,使用。(不要命名或声明变量来反映它们的实现类型:<代码>集合字符串而不是<代码> A<代码>,(或<代码>列表< /代码>,如果<代码>集合< /代码>“不能做”)嘿,谢谢,我确实考虑过了,但是我认为结构会有太多的改变。我已经有了一个递归实现,我希望保持迭代一个尽可能接近的任何帮助与“你可以考虑保持另一个堆栈跟踪字符串从父”的帮助。
TernaryTreeNode mynode = nodeStack.peek();
nodeStack.pop();
TernaryTreeNode mynode = nodeStack.pop();