Click here to Skip to main content
13,704,105 members
Rate this:
 
Please Sign up or sign in to vote.
See more:
//copying the tree into array

#include <iostream>
using namespace std;

struct node {
    int value;
    node *left, *right;
};
node *root;

class search_tree {


public:
    search_tree()
    {
        root=NULL;
    }
    void copy(node *from_tree, int to_heap[] ,int i);
    node *insert(node *m_node, int key);
    void print(int to_heap[], int size);

};

node *newNode(int item)
{
    node *temp=new node;
    temp->value=item;
    temp->left=NULL;
    temp->right=NULL;
    return temp;
}



node *search_tree::insert(node *m_node, int key)
{
    if(m_node==NULL)
    {
        return newNode(key);

    }
    if(key<m_node->value)
    {
        m_node->left=insert(m_node->left, key);
    }
    if(key>m_node->value)
    {
        m_node->right=insert(m_node->right, key);
    }
    return m_node;

}


void search_tree::copy(node *from_tree, int to_heap[], int i)
{

    if(from_tree==NULL)
    {
        return;
    }
    to_heap[i]=from_tree->value;
    i++;

    copy(from_tree->left, to_heap, i);
    copy(from_tree->right, to_heap, i);

//    int i=0;
//
//
//    if(root!=NULL)
//    {
//        to_heap[i]=root->value;
//        i++;
//    }
//    if(root==NULL)
//    {
//        return;
//    }
//    copy(root->left, to_heap);
//    copy(root->right, to_heap);
}

void search_tree::print(int to_heap[], int size)
{
    for(int j=0; j<size; j++)
    {
        cout<<to_heap[j]<<endl;
    }
}
int main()
{
    search_tree tree;
    node *root=NULL;
    root=tree.insert(root, 50);
    tree.insert(root, 30);
    tree.insert(root, 20);
    tree.insert(root, 40);
    tree.insert(root, 70);
    tree.insert(root, 60);
    tree.insert(root, 50);
    int size=7;
    int to_heap[size]={};
    int i=0;
    tree.copy(root, to_heap, i);
    tree.print(to_heap, size);

}


What I have tried:

I have tried by making arrays pointers but no difference
Posted 7-Dec-17 9:58am
Updated 7-Dec-17 11:45am

1 solution

Rate this: bad
 
good
Please Sign up or sign in to vote.

Solution 1

The problem is that when you call the second copy, it have no idea of how many values were copied in array by first call.
copy(from_tree->left, to_heap, i);
copy(from_tree->right, to_heap, i);

In such a recursive function, child must tell its parent what happened.

There is a tool that allow you to see what your code is doing, its name is debugger. It is also a great learning tool because it show you reality and you can see which expectation match reality.
When you don't understand what your code is doing or why it does what it does, the answer is debugger.
Use the debugger to see what your code is doing. Just set a breakpoint and see your code performing, the debugger allow you to execute lines 1 by 1 and to inspect variables as it execute.

Debugger - Wikipedia, the free encyclopedia[^]

Mastering Debugging in Visual Studio 2010 - A Beginner's Guide[^]
Basic Debugging with Visual Studio 2010 - YouTube[^]
The debugger is here to show you what your code is doing and your task is to compare with what it should do.
There is no magic in the debugger, it don't find bugs, it just help you to. When the code don't do what is expected, you are close to a bug.

[Update]
Instead of using the debugger, you can use this, it should help you to understand what is going on:
void search_tree::copy(node *from_tree, int to_heap[], int i)
{

if(from_tree==NULL)
{
return;
}
cout<<from_tree->value<<i<<endl;
to_heap[i]=from_tree->value;
i++;
copy(from_tree->left, to_heap, i);

int right=i+2;

copy(from_tree->right, to_heap, right);
right=i+2;

}

To further test your code:
- Change the order of values you insert, it shouldn't the printed result.
- Change the number of values in tree, see how it change the result.
- Add duplicate values.
  Permalink  
v2
Comments
7-Dec-17 17:53pm
   
thank you very much for responding, sadly I used debugger many times in this code and don't understand the problem, maybe I am not using debugger well
Patrice T 7-Dec-17 18:03pm
   
Use the debugger to execute the copy step by step and pay attention to the value of i
7-Dec-17 18:07pm
   
it gets incremented when the node is not null, it is the index of array that must be filled
Patrice T 7-Dec-17 18:21pm
   
Yes, this part is OK.
But what happen to the increment when then routine returns from left to call right ?
7-Dec-17 18:08pm
   
it gets incremented and decremented also
Patrice T 7-Dec-17 18:30pm
   
Are you sure that it have to be decremented ?
Draw a the tree and give a number to each mode, the number is the position it should have in array and compare with what your code is doing.
8-Dec-17 11:13am
   
ok I will do that. now when I write this code it does not print 40 only
#include <iostream>
using namespace std;

struct node {
int value;
node *left, *right;
};
node *root;

class search_tree {

public:
search_tree()
{
root=NULL;
}
void copy(node *from_tree, int to_heap[] ,int i);
node *insert(node *m_node, int key);
void print(int to_heap[], int size);

};

node *newNode(int item)
{
node *temp=new node;
temp->value=item;
temp->left=NULL;
temp->right=NULL;
return temp;
}



node *search_tree::insert(node *m_node, int key)
{
if(m_node==NULL)
{
return newNode(key);

}
if(key<m_node->value)
{
m_node->left=insert(m_node->left, key);
}
if(key>=m_node->value)
{
m_node->right=insert(m_node->right, key);
}
return m_node;

}


void search_tree::copy(node *from_tree, int to_heap[], int i)
{

if(from_tree==NULL)
{
return;
}
to_heap[i]=from_tree->value;
i++;
copy(from_tree->left, to_heap, i);

int right=i+2;

copy(from_tree->right, to_heap, right);
right=i+2;

}

void search_tree::print(int to_heap[], int size)
{
for(int j=0; j<size; j++)
{
cout<<to_heap[j]<<endl;
}
}
int main()
{
search_tree tree;
node *root=NULL;
root=tree.insert(root, 50);
tree.insert(root, 30);
tree.insert(root, 20);
tree.insert(root, 40);
tree.insert(root, 70);
tree.insert(root, 60);
tree.insert(root, 50);
int size=7;
int to_heap[size]={};
int i=0;
tree.copy(root, to_heap, i);
tree.print(to_heap, size);

}
Patrice T 8-Dec-17 15:01pm
   
Use Improve question to update your question.
So that everyone can pay attention to this information.
Explain what you have done and actual problem.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


Advertise | Privacy | Cookies | Terms of Service
Web01-2016 | 2.8.180920.1 | Last Updated 8 Dec 2017
Copyright © CodeProject, 1999-2018
All Rights Reserved.
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100