#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
struct Node //Tree Node
{
int key;
struct Node *left;
struct Node *right;
};
int nodes[21], counter; //nodes[] array keeps all the nodes of the tree
//in increasing order
//counter tracks the current index of the array
void preorder(Node* node){ //Preorder traversal of the tree
if(node==NULL){
return;
}
preorder(node->left);
nodes[counter++]=node->key;
preorder(node->right);
}
struct Node* createNode(int key){ //Tree Node Creation
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->key = key;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void createTree(struct Node* newNode, struct Node* node){ //Creates a
//binary search tree
if(!node){
node=newNode; //Problem Line
return;
}
if(newNode->key<node->key){
createTree(newNode, node->left);
}
else if(newNode->key>node->key){
createTree(newNode, node->right);
}
}
int main(){
int node_count, node_value;
struct Node* root = NULL;
cout<<"Enter number of nodes"<<endl;
cin>>node_count;
cout<<"Enter node values in a space-separated format"<<endl;
for(int i=0;i<node_count;i++){
cin>>node_value;
struct Node* newNode = createNode(node_value);
if(!root){
root = newNode;
}
else{
createTree(newNode, root);
}
cout<<root->left<<" "<<root->right<<endl;
}
counter=0;
preorder(root);
for(int i=0;i<counter;i++){
cout<<nodes[i]<<" ";
}
cout<<endl;
getch();
return 0;
}
上面是创建BST然后将其前序遍历存储在数组中的代码。我已经提到了问题行(指针的分配没有发生)。有人可以帮我解决这个问题。
答案 0 :(得分:2)
从函数返回后,指定指针不会影响该值....请阅读有关pointer point to pointer
和passing-arguments by reference in cpp
以下代码可以解决部分问题,但不是全部,我相信您的代码中一定存在更多问题,但我不想浪费时间进行调试。
void createTree(struct Node* &newNode, struct Node* &node){ //Creates a
//binary search tree
if(!node){
node=newNode; //Problem Line
return;
}
if(newNode->key<node->key){
createTree(newNode, node->left);
}
else if(newNode->key>node->key){
createTree(newNode, node->right);
}
}
答案 1 :(得分:0)
您没有将任何节点分配给左右指针。 这应该可以解决问题。
void createTree(struct Node* newNode, struct Node* node) {
if (!node) {
node = newNode;
return;
}
if (newNode->key < node->key) {
// if left node is null assign new node
if (!node->left) {
node->left = newNode;
return;
}
else {
createTree(newNode, node->left);
}
}
else if (newNode->key > node->key) {
// if right node is null assign new node
if (!node->right) {
node->right = newNode;
return;
}
else {
createTree(newNode, node->right);
}
}
}