从数组构造二叉树

时间:2014-01-08 16:54:16

标签: c++ tree traversal

上下文:使用二叉树(BinStabloMapa)实现地图

任务如下:

向BinStabloMapa类添加一个新的构造函数,该类接收2个正整数数组(键数组和值数组)。给定这两个数组,构造函数应该创建一个二叉树,条件是keys数组的元素是其前序遍历中树的元素,而values数组的元素是对应于键的值。键数组中的值为0表示该点中没有节点。

我在这里有一个测试示例:

int keys[9] = {6, 4, 3, 0, 0, 5, 0, 0, 0};
int values[9] = {6, 4, 3, 0, 0, 5, 0, 0, 0};
BinStabloMapa<int,int> m(keys, values, 9, 1);
cout << m[3] << " " << m[4] << " " << m[5] << " " << m[6] << " " << m[9];

它应该输出:3,4,5,6,0 - 但它输出3,4,0,6,0。

这是带有辅助方法的构造函数:

template<typename Key, typename Value>
void BinStabloMapa<Key, Value>::preOrderWithArray(BSNode<Key, Value>*& node, int* keys, int* values, const int& size, int &index){

      if(index == size) return;
      if(node == _root){
            _root = new BSNode<Key, Value>(values[index], keys[index], 0, 0, 0);
            node = _root;
        } else{
            node->_key = keys[index];
            node->_value = values[index];
        }

        node->_left = new BSNode<Key, Value>(Value(), Key(), node, 0, 0);
        node->_right = new BSNode<Key, Value>(Value(), Key(), node, 0, 0);
        index++;

        preOrderWithArray(node->_left, keys, values, size, index);
        preOrderWithArray(node->_right, keys, values, size, index);

}



//Constructor
template<typename Key, typename Value>
BinStabloMapa<Key, Value>::BinStabloMapa(int *keys, int *values, int size, int dummy){
    int index = 0;
    _root = 0;
    preOrderWithArray(_root, keys, values, size , index);
    _numOfElements = size;
}

我知道有类似的问题,但我不明白为什么这段代码不起作用?也许它可以改进?

提前致谢。

编辑:

以下是来自valgrind的内容,您可能会发现它很有用:

内存泄漏(BinStabloMapa.h:114)

Valgrind输出: 1个块中的20个字节肯定在丢失记录1中丢失1 在0x4005B65:operator new(unsigned)(vg_replace_malloc.c:163) 在0x4005B65:operator new(unsigned)(vg_replace_malloc.c:163) by 0x804AE6D:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:114) by 0x804AE6D:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:114) by 0x804AEDE:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:117) by 0x804AEDE:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:117) by 0x804AEDE:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:117) by 0x804AEDE:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:117) by 0x804AEDE:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:117) by 0x804AEDE:BinStabloMapa :: preOrderWithArray(BSNode &amp;,int ,int *,int const&amp;,int&amp;)(BinStabloMapa.h:117) by 0x804AF77:BinStabloMapa :: BinStabloMapa(int *,int *,int,int)(BinStabloMapa.h:129) by 0x804AF77:BinStabloMapa :: BinStabloMapa(int *,int *,int,int)(BinStabloMapa.h:129) by 0x8048BD9:main(autotest.cpp:178) by 0x8048BD9:main(autotest.cpp:178)

在它说内存泄漏的行我做node-&gt; _right等于等。

0 个答案:

没有答案