gpt4 book ai didi

c++ - 需要帮助找到错误(与指向堆栈变量的指针有关)

转载 作者:行者123 更新时间:2023-11-28 00:48:36 25 4
gpt4 key购买 nike

有人能告诉我我的程序有什么问题吗?这基本上是一个在二叉搜索树中插入新节点的程序。

问题是我的插入功能正常工作并且正在插入节点我正在主程序中验证这一行

     cout<<a.left->right->right->data;

输出正确,即 5

但是当我尝试打印二叉树的层次顺序遍历时,一些垃圾值正在代替新节点传递,程序崩溃了

有人可以看看并向我解释我做错了什么以及如何在主程序中显示正确的值。

#include<iostream>
#include<string>
#include<conio.h>
#include<array>
#include<stack>
#include<sstream>
#include<algorithm>
#include<vector>
#include<ctype.h>//isdigit
#include<deque>
#include<queue>
#include<map>
using namespace::std;
struct BST
{
int data;
BST *left;
BST *right;
BST(int d,struct BST* l,BST *r):data(d) , left(l) ,right(r)
{
}
};

void levelOrder(struct BST *root)
{
struct BST *temp=NULL;
int count =0;
deque<struct BST*> dq;
if(!root)
{
return;
}
dq.push_back(root);
count=dq.size();
while(!dq.empty())
{
temp=dq.front();
cout<<temp->data<<" ";
if(temp->left)
{
dq.push_back(temp->left);
}
if(temp->right)
{
dq.push_back(temp->right);
}
dq.pop_front();
if(--count==0)
{
cout<<endl;
count=dq.size();
}
}
}
void Insert(struct BST*root,int data)
{
struct BST temp(data,NULL,NULL);
if(!root)
{
return;
}
while(root)
{
if((root)->data >data)
{
(root)=(root)->left;
if(!(root)->left)
{
(root)->left=&temp;
break;
}
}
else
{
(root)=(root)->right;
if(!(root)->right)
{
(root)->right=&temp;
break;
}
}
}
}
int main()
{
deque<struct BST> dq1,dq2;
BST e(4,NULL,NULL);
BST f(3,NULL,NULL);
BST d(1,&f,NULL);
//BST g(4,NULL,NULL);
BST b(2,&d,&e);
BST c(8,NULL,NULL);
BST a(6,&b,&c);
levelOrder(&a);
Insert(&a,5);
cout<<a.left->right->right->data;
cout<<endl;
levelOrder(&a);
_getch();
return 0;
}

最佳答案

原因是因为您在 Insert 函数中放入了指向树中局部变量的指针。

当一个函数返回时,它的所有局部变量都不再“活着”,并且访问指向这些局部变量之一的指针是未定义的行为。事实上,无论你调用什么函数,这些变量曾经占用的内存都可能被下一个函数调用覆盖。

如果你想添加一个新节点,你需要在堆上分配它,例如。但是,由于您对树的设计,这将导致内存泄漏,因为您没有释放任何子节点。事实上,当您在 main 函数中使用指向局部变量的指针时(没关系,因为这些变量的生命周期是在整个程序的 main 期间)你不能随便删除指针。

关于c++ - 需要帮助找到错误(与指向堆栈变量的指针有关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com