递归如何遍历三元搜索树?

时间:2019-06-15 14:54:56

标签: c++ recursion traversal clion ternary-search-tree

我目前正在尝试了解三元搜索树,以此作为一种手段来为我的学校项目寻找单词。但是,对于三元搜索树,遍历如何工作感到困惑。

我知道它与二进制搜索树的代码非常相似,但是我遇到了使用递归的遍历代码,这使我不确定遍历的原理。

这是遍历代码:

void traverse_tree(Node *root, string &out){ 
    if(root){
        traverse_tree(root ->left, out); // Traversing left sub-tree
        cout<<out<<endl;

        out.push_back(root ->key); // appending current character

        if(root ->flag)
            cout <<out <<"\n"; // if string ends here

        traverse_tree(root ->mid, out); // Traversing mid sub-tree

        out.pop_back(); // removing last character
        cout<<out<<"+"<<endl;

        traverse_tree(root ->right, out); // Traversing right sub-tree
    }
}

我尝试添加3个单词(adrian,test,testing)作为示例,并在第一次递归之后放置了2个cout,另一个在弹出“ out”以包含树中的下一个单词之后。 “ +”号只是区分第一个和最后一个提示的一种方法。我得到这个结果:

a
ad
adr
adri
adria
adrian
adrian
adria+
adri+
adr+
ad+
a+
+
t
te
tes
test
test
testi
testin
testing
testing
testin+
testi+
test+
tes+
te+
t+
+

我知道的是,当使用root-> left的递归完成时,push_back行应该从底部递归到顶部执行。我从以下链接中学到了这一点:https://www.geeksforgeeks.org/recursion/,因此,当调用cout时,我从此代码中期望的是逐个字母的“ nairda”而不是“ adrian”。那么,递归本质上是如何工作的呢?在此代码中如何工作?是否有类似特殊情况的情况,即一旦完成多次递归,执行将从第一个递归而不是最后一个递归开始?谢谢。

0 个答案:

没有答案