需要二叉树遍历代码解释
binary tree traversal code explaination needed
我对这个二叉树遍历代码的工作原理有疑问。
void BinaryTree_Functions::preorder(Binary_TreeNode* bt)
{
if (bt == NULL) { return; }
cout << bt->data <<endl;
preorder(bt->Left);
preorder(bt->Right);
}
前序遍历
void BinaryTree_Functions::inorder(Binary_TreeNode* bt)
{
if (bt == NULL) { return; }
inorder(bt->Left);
cout << bt->data << endl;
inorder(bt->Right);
}
中序遍历
void BinaryTree_Functions::postorder(Binary_TreeNode* bt)
{
if (bt == NULL) { return; }
postorder(bt->Left);
postorder(bt->Right);
cout << bt->data << endl;
}
后序遍历
我知道这些遍历是如何工作的,但我不明白代码。
当你不说具体是什么让你感到困惑时,很难解释。问题似乎是递归。要更轻松地查看发生了什么,您可以使用示例树并查看输出有何不同。要了解不同的订单如何以不同的方式遍历这三个,您还可以查看这棵假树:
#include<iostream>
#include<string>
struct fake_tree {
unsigned size = 4;
void preorder(const std::string& node){
if (node.size() >= size) return;
std::cout << node << "\n";
preorder(node+"l");
preorder(node+"r");
}
void postorder(const std::string& node){
if (node.size() >= size) return;
postorder(node+"l");
postorder(node+"r");
std::cout << node << "\n";
}
void inorder(const std::string& node){
if (node.size() >= size) return;
inorder(node+"l");
std::cout << node << "\n";
inorder(node+"r");
}
};
int main()
{
fake_tree ft;
ft.preorder("0");
std::cout << "\n";
ft.postorder("0");
std::cout << "\n";
ft.inorder("0");
}
输出为:
0
0l
0ll
0lr
0r
0rl
0rr
0ll
0lr
0l
0rl
0rr
0r
0
0ll
0l
0lr
0
0rl
0r
0rr
输出直接告诉您输出是在调用堆栈中的哪个位置产生的。例如,最后一个 0rr
是由 inorder("0")
调用 inorder("0r")
产生的,后者又调用 inorder("0rr")
。因为 inorder("0")
首先调用 inorder("0l")
然后打印 "0"
然后调用 inorder("0r")
,这就是您在输出中看到的顺序。
同样 inorder("0r")
首先调用 inorder("0rl")
然后打印 "0r"
然后调用 inorder("0rr")
.
如果您现在在纸上画树,您可以跟踪不同的遍历如何以不同的方式穿过树。
我对这个二叉树遍历代码的工作原理有疑问。
void BinaryTree_Functions::preorder(Binary_TreeNode* bt)
{
if (bt == NULL) { return; }
cout << bt->data <<endl;
preorder(bt->Left);
preorder(bt->Right);
}
前序遍历
void BinaryTree_Functions::inorder(Binary_TreeNode* bt)
{
if (bt == NULL) { return; }
inorder(bt->Left);
cout << bt->data << endl;
inorder(bt->Right);
}
中序遍历
void BinaryTree_Functions::postorder(Binary_TreeNode* bt)
{
if (bt == NULL) { return; }
postorder(bt->Left);
postorder(bt->Right);
cout << bt->data << endl;
}
后序遍历
我知道这些遍历是如何工作的,但我不明白代码。
当你不说具体是什么让你感到困惑时,很难解释。问题似乎是递归。要更轻松地查看发生了什么,您可以使用示例树并查看输出有何不同。要了解不同的订单如何以不同的方式遍历这三个,您还可以查看这棵假树:
#include<iostream>
#include<string>
struct fake_tree {
unsigned size = 4;
void preorder(const std::string& node){
if (node.size() >= size) return;
std::cout << node << "\n";
preorder(node+"l");
preorder(node+"r");
}
void postorder(const std::string& node){
if (node.size() >= size) return;
postorder(node+"l");
postorder(node+"r");
std::cout << node << "\n";
}
void inorder(const std::string& node){
if (node.size() >= size) return;
inorder(node+"l");
std::cout << node << "\n";
inorder(node+"r");
}
};
int main()
{
fake_tree ft;
ft.preorder("0");
std::cout << "\n";
ft.postorder("0");
std::cout << "\n";
ft.inorder("0");
}
输出为:
0
0l
0ll
0lr
0r
0rl
0rr
0ll
0lr
0l
0rl
0rr
0r
0
0ll
0l
0lr
0
0rl
0r
0rr
输出直接告诉您输出是在调用堆栈中的哪个位置产生的。例如,最后一个 0rr
是由 inorder("0")
调用 inorder("0r")
产生的,后者又调用 inorder("0rr")
。因为 inorder("0")
首先调用 inorder("0l")
然后打印 "0"
然后调用 inorder("0r")
,这就是您在输出中看到的顺序。
同样 inorder("0r")
首先调用 inorder("0rl")
然后打印 "0r"
然后调用 inorder("0rr")
.
如果您现在在纸上画树,您可以跟踪不同的遍历如何以不同的方式穿过树。