如何仅使用 iostream 库打印二进制搜索树中的所有节点?
How to print all nodes in Binary Search Tree only use iostream library?
我想打印树中的所有节点(先打印级别低的节点,对于输出级别相同的节点,先打印值小的节点)
例如:输入
预期输出:10 6 20 1 8 18 21 7 25.
我试过这样编码
void print_Nodes(Node *root)
{
if(root == nullptr) return;
cout << root->value << " ";
if(root->left!=nullptr){
cout << root->left->value << " ";
if(root->right!=nullptr){
cout << root->right->value << " ";
}
}
print_Nodes(root->right);
print_Nodes(root->left);
}
但输出是:10 6 20 6 1 8 1 8 7 7 20 18 21 18 21 25。
你能指导我如何解决这个问题吗?
您正在打印 root->left->value
,然后调用 print_Nodes(root->left)
,它再次打印 root->value
(其中 root
是之前的 root->left
)。所以他们都出现了两次。
而且你在做深度优先遍历,而你实际上想要广度优先遍历。要在继续下一个级别之前遍历一个级别上的所有节点,您需要一个额外的数据结构来记住节点,以便您稍后可以返回它们并继续向下。
#include <iostream>
#include <queue>
struct Node {
Node* left = nullptr;
Node* right = nullptr;
Node(int value) : value(value) {}
int value;
};
void bft(Node* root) {
std::queue<Node*> q;
q.push(root);
while (!q.empty()) {
Node* current = q.front();
q.pop();
std::cout << current->value << " ";
if (current->left) q.push(current->left);
if (current->right) q.push(current->right);
}
}
int main() {
Node root(10);
Node n6(6);
Node n20(20);
Node n1(1);
Node n8(8);
Node n18(18);
Node n21(21);
Node n7(7);
Node n25(25);
root.left = &n6;
root.right = &n20;
n6.left = &n1;
n6.right = &n8;
n20.left = &n18;
n20.right = &n21;
n8.left = &n7;
n21.right = &n25;
bft(&root);
}
我想打印树中的所有节点(先打印级别低的节点,对于输出级别相同的节点,先打印值小的节点)
例如:输入
预期输出:10 6 20 1 8 18 21 7 25. 我试过这样编码
void print_Nodes(Node *root)
{
if(root == nullptr) return;
cout << root->value << " ";
if(root->left!=nullptr){
cout << root->left->value << " ";
if(root->right!=nullptr){
cout << root->right->value << " ";
}
}
print_Nodes(root->right);
print_Nodes(root->left);
}
但输出是:10 6 20 6 1 8 1 8 7 7 20 18 21 18 21 25。 你能指导我如何解决这个问题吗?
您正在打印 root->left->value
,然后调用 print_Nodes(root->left)
,它再次打印 root->value
(其中 root
是之前的 root->left
)。所以他们都出现了两次。
而且你在做深度优先遍历,而你实际上想要广度优先遍历。要在继续下一个级别之前遍历一个级别上的所有节点,您需要一个额外的数据结构来记住节点,以便您稍后可以返回它们并继续向下。
#include <iostream>
#include <queue>
struct Node {
Node* left = nullptr;
Node* right = nullptr;
Node(int value) : value(value) {}
int value;
};
void bft(Node* root) {
std::queue<Node*> q;
q.push(root);
while (!q.empty()) {
Node* current = q.front();
q.pop();
std::cout << current->value << " ";
if (current->left) q.push(current->left);
if (current->right) q.push(current->right);
}
}
int main() {
Node root(10);
Node n6(6);
Node n20(20);
Node n1(1);
Node n8(8);
Node n18(18);
Node n21(21);
Node n7(7);
Node n25(25);
root.left = &n6;
root.right = &n20;
n6.left = &n1;
n6.right = &n8;
n20.left = &n18;
n20.right = &n21;
n8.left = &n7;
n21.right = &n25;
bft(&root);
}