Click here to Skip to main content
15,896,435 members
Please Sign up or sign in to vote.
1.00/5 (1 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
Updated 7-Dec-17 11:45am

1 solution

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.
C++
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:
C++
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.
 
Share this answer
 
v2
Comments
Member 13277493 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
Member 13277493 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 ?
Member 13277493 7-Dec-17 18:08pm    
it gets incremented and decremented also

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



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900