c++ - 在 C++ 中打印级别明智的二叉树
问题描述
输出给出 - 运行时错误(SIGSEGV)。可能是什么问题呢?
问题:
给定一棵二叉树,按级别顺序打印该树。要打印具有数据 N 的节点,您需要遵循确切的格式 - N:L:x,R:y 其中,N 是二叉树中存在的任何节点的数据。x 和 y 是节点 N 的左右子节点的值。打印 -1。如果任何孩子为空。中间没有空隙。您需要在不同的行中打印级别订单表单中的所有节点。输入格式:层序形式的元素(以空格分隔)(如果任何节点没有左子或右子,则取-1代替)示例输入:
8 3 10 1 6 -1 14 -1 -1 4 7 13 -1 -1 -1 -1 -1 -1 -1
样本输出:
8:L:3,R:10 3:L:1,R:6 10:L:-1,R:14 1:L:-1,R:-1 6:L:4,R:7 14: L:13,R:-1 4:L:-1,R:-1 7:L:-1,R:-1 13:L:-1,R:-1
这是代码:
// Following is the Binary Tree node structure
/**************
class BinaryTreeNode {
public :
T data;
BinaryTreeNode<T> *left;
BinaryTreeNode<T> *right;
BinaryTreeNode(T data) {
this -> data = data;
left = NULL;
right = NULL;
}
};
***************/
void printLevelWise(BinaryTreeNode<int> *root) {
if(root == NULL){
return;
}
cout << root->data << ":";
queue<BinaryTreeNode<int>*> pendingNodes;
pendingNodes.push(root);
while(pendingNodes.size() != NULL){
BinaryTreeNode<int>* front = pendingNodes.front();
pendingNodes.pop();
if(front->left->data != -1){
cout << "L:" << front->left->data << ",";
pendingNodes.push(front->left);
}
else if(front->left->data == -1){
cout << "L:" << "-1" << ",";
}
if(front->right->data != -1){
cout << "R:" << front->right->data;
pendingNodes.push(front->right);
}
else if(front->left->data == -1){
cout << "R:" << "-1";
}
cout << endl;
}
/* Don't write main().
* Don't read input, it is passed as function argument.
* Print output and don't return it.
* Taking input is handled automatically.
*/
}
解决方案
if(front->left->data != -1) 当您的子树不包含左节点并且您正在检查 left->data!=-1 这就是您收到运行时错误 (SIGSEGV) 的原因
使用此代码
/**************
class BinaryTreeNode {
public :
T data;
BinaryTreeNode<T> *left;
BinaryTreeNode<T> *right;
BinaryTreeNode(T data) {
this -> data = data;
left = NULL;
right = NULL;
}
};
***************/
void printLevelWise(BinaryTreeNode<int> *root) {
if(root == NULL){
return;
}
queue<BinaryTreeNode<int>*> pendingNodes;
pendingNodes.push(root);
while(pendingNodes.size() != NULL){
BinaryTreeNode<int>* front = pendingNodes.front();
pendingNodes.pop();
cout << front->data << ":";
if(front->left){
if(front->left->data != -1){
cout << "L:" << front->left->data << ",";
pendingNodes.push(front->left);
}
else{
cout << "L:" << "-1" << ",";
}
}
if(front->right){
if(front->right->data != -1){
cout << "R:" << front->right->data;
pendingNodes.push(front->right);
}
else{
cout << "R:" << "-1";
}
}
}
/* Don't write main().
* Don't read input, it is passed as function argument.
* Print output and don't return it.
* Taking input is handled automatically.
*/
}
推荐阅读
- assembly - 引导加载程序 - 长模式下的 LBA28 不工作
- android - 我在全屏 Android 应用程序中定位视图时遇到问题
- react-native - 键盘弹出时如何阻止视图向上移动?
- ruby-on-rails - 如何设置 Selenium Webdriver、Capybara 和 Rails Minitest?
- mysql - 重启后恢复docker mysql实例
- python - 如何通过包含极端情况将文本拆分为句子
- python - 具有典型相关分析的空间滤波器
- c# - 将内存流直接复制到与字节[]占用相同内存的东西中?
- angular - 如何在Angular的另一个HTTP get方法订阅中订阅HTTP get方法?
- python-3.x - 如何仅更改 DRF 中继承的序列化程序类中的字段属性?