#include "stdafx.h"
#include <iostream>
using namespace std;
struct node
{
int element;
node *left;
node *right;
int height=-1;
};
struct BST
{
bool isSameRoot=true;
int hight=0;
node* root=NULL ;
void addElement(int n);
void insert(node* Node,int number);
void preorder(node* p);
};
void BST::addElement(int n)
{
insert(root, n);
cout << "Adding" << endl;
}
void BST::insert(node* p,int n)
{
if (p == NULL)
{
p = new node;
p->element = n;
p->left = NULL;
p->right = NULL;
if (isSameRoot)// To skip one of the iterations;
{
hight++;
}
isSameRoot = !isSameRoot;
p->height = hight;
cout << "Element is Added:: " << n<<endl;
cout << "HEIGHT==: " <<p->height<<endl ;
}
else
{
if (n<p->element)
{
insert(p->left, n);
}
else if (n>p->element)
{
insert(p->right, n);
}
}
}
void preorder(node* p)
{
while (p != NULL)
{
cout << p->element << endl;
preorder(p->left);
preorder(p->right);
}
}
int main()
{
BST* tree=new BST ;
tree->addElement(8);
tree->addElement(9);
tree->addElement(45);
tree->addElement(25);
tree->addElement(97);
tree->addElement(78);
preorder(tree->root);//Here is the disease;
return 0;
}
我的问题可能非常基础但很重要;
显然在BST中我们应该将每个节点连接到根节点;
你能看看我的代码并告诉我如何解决这个问题;
在preorder()
方法之前,一切正常/看起来很好;
我没有使用单根节点;
这是我的问题; 我应该如何将节点连接到根节点;
答案 0 :(得分:2)
如果您的目标只是逐步生成BST并稍后通过遍历转储其内容,您甚至不需要将节点连接到其父节点或根节点,您似乎也不需要跟踪高度或'高度节点'[sic]。
您的问题是您根本没有构建树。在插入NULL节点时,您只需设置一个指向新节点的临时指针。 C ++按值而不是引用传递参数,因此您认为在BST中设置的'p'只是BST根的临时副本,并且在BST :: insert调用结束时丢失(和泄漏)
那就是说,这里有一些其他建议:
编辑:我感到无聊。这是你的作业答案,请你投票并接受我的答案,我可以为我自己的问题使用一些更多的声望奖励......
struct node {
int element;
node *left;
node *right;
node(int n = 0) : element(n), left(NULL), right(NULL) { }
};
struct BST{
node *root = NULL;
void addElement(int n);
void insert(node &Node, int number);
void preorder(node *p);
};
void BST::addElement(int n) {
if (!root) { root = new node(n); }
else { insert(*root, n); }
}
void BST::insert(node &p, int n) {
if (n < p.element) {
if (!p.left) { p.left = new node(n); }
else { insert(*(p.left), n); }
}
else if (n > p.element) {
if (!p.right) { p.right = new node(n); }
else { insert(*(p.right), n); }
}
}
void preorder(node *p) {
if (!p) { return; }
cout << p->element << endl;
preorder(p->left);
preorder(p->right);
}
答案 1 :(得分:0)
你正在做(p!= NULL) - 卡在无限循环中。 if(p!= null)。