C++ 使用包含指针的队列时的奇怪行为
我试图创建一个二叉树,当您尝试向其中添加新节点时,它会将节点添加到第一个位置,即C++ 使用包含指针的队列时的奇怪行为,c++,pointers,stl,queue,C++,Pointers,Stl,Queue,我试图创建一个二叉树,当您尝试向其中添加新节点时,它会将节点添加到第一个位置,即nullptr 实际上是制作一个完整的二叉树 请看下面的代码: #include <iostream> #include <queue> using namespace std; class node{ private: char data; node* right; node* left; public: node(char n){ data
nullptr
实际上是制作一个完整的二叉树
请看下面的代码:
#include <iostream>
#include <queue>
using namespace std;
class node{
private:
char data;
node* right;
node* left;
public:
node(char n){
data = n;
left = nullptr;
right = nullptr;
}
char getdata(){
return data;
}
friend class binTree;
};
class binTree{
private:
node *root;
public:
binTree(){
root = nullptr;
}
binTree(node *root){
this->root = root;
}
node* getRoot(){
return this->root;
}
void addNode(char data){
cout << "adding " << data << endl;
if(root == nullptr) {
root = new node(data);
return;
}
queue<node*> Q;
Q.push(root);
node* toadd;
while(true) {
node* toadd = Q.front();
Q.pop();
Q.push(toadd->left);
Q.push(toadd->right);
if(toadd->left == nullptr) break;
if(toadd->right == nullptr) break;
}
if((toadd->left) == nullptr)
{
cout << "add data to the left of " << toadd -> data << endl;
toadd->left = new node(data);
} else if((toadd -> right) == nullptr){
cout << "add data to the right of " << toadd -> data << endl;
toadd->right = new node(data);
} else {
cout << "toadd left and right are not nullptr" << endl;
}
}
};
int main()
{
binTree bin;
string s = "abcdefg";
cout << s << endl << endl;
for(int i = 0; i < s.size(); i++)
{
bin.addNode(s[i]);
}
}
奇怪的是,当打印“toadd left and right not nullptr”时
因为存在一段时间(真),唯一的退出条件是:
if(toadd->left == nullptr) break;
if(toadd->right == nullptr) break;
所以其中一个条件是真的,我们可以打破循环;
因此,我们应该输入以下代码的if
或else if
部分(在while之后),但令人惊讶的是,我们输入了else
部分并在打印结束时“toadd left和right都不是null ptr”。
有人能解释这种行为吗?您已经定义了两次添加
,一次在循环之前,一次在循环内部。容易犯错误。您已经定义了两次添加,一次在循环之前,一次在循环内部。容易犯错误。-Werror=shadow
在gcc和clang上避免此类错误。-Werror=shadow
在gcc和clang上避免此类错误。
if(toadd->left == nullptr) break;
if(toadd->right == nullptr) break;