我目前正在尝试了解三元搜索树,以此作为一种手段来为我的学校项目寻找单词。但是,对于三元搜索树,遍历如何工作感到困惑。
我知道它与二进制搜索树的代码非常相似,但是我遇到了使用递归的遍历代码,这使我不确定遍历的原理。
这是遍历代码:
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”。那么,递归本质上是如何工作的呢?在此代码中如何工作?是否有类似特殊情况的情况,即一旦完成多次递归,执行将从第一个递归而不是最后一个递归开始?谢谢。