在Managed C ++中编写二叉树类

时间:2012-11-22 05:24:38

标签: visual-c++ binary-tree

我正在试图弄清楚如何在托管C ++中为学校项目创建二叉树类。我在非托管C ++中找到了很好的例子,在C#中找到了一些非常好的例子,所以我能够很好地理解正在发生的事情,但我似乎无法在托管C ++中弄明白。我想知道的是:为什么我得到堆栈溢出(见下文),这是一个明智的方法吗?这是我的班级:

#pragma once

#include "stdafx.h"
#include <iostream>
#include <deque>
#include <climits>

using namespace std;
using namespace System;
using namespace System::Collections;

ref struct Node
{
int data;
Node ^parent;
Node ^left;
Node ^right;

// constructors
// default constructor

Node (){}
// constructor that takes a node with no leafs
// a constructor that accepts a new node with no children
Node(int input)
{
    Node ^node = gcnew Node(input);
    node->data =input;
    node->left = nullptr;
    node->right = nullptr;
    node->parent = nullptr;
}

// method to create a new Node 
Node ^newNode(int data)
{
    Node ^node = gcnew Node;
    node->data = data;
    node->left = nullptr;
    node->right = nullptr;
    node->parent = nullptr;

    return node;
}

// method that inserts a new node into an existing tree
Node ^insertNode(Node ^node, int input)
{
    Node ^p;
    Node ^returnNode;
    if (node == nullptr)
    {
        returnNode = newNode(input);
        returnNode->parent = p;
        return returnNode;
    }

    if (input <= node->data)
    {
        p = node;
        node->left = insertNode(node->left, input);
    }

    else
    {
        p = node;
        node->right = insertNode(node->right, input);
    }
    return node;
}

};

当我创建一个新实例并尝试添加一个节点时,我得到一个堆栈溢出异常。

#include "stdafx.h"
#include "GenericNodeClass.h"
#include "BinarySearchTreeClass.h"

using namespace std;
using namespace System;

int main ()
{
BinarySearchTreeClass^ BTree = gcnew BinarySearchTreeClass();

Node ^newNode = gcnew Node(7);
newNode = newNode->insertNode(newNode, 6);  // this just looks stupid
return 0;
}

1 个答案:

答案 0 :(得分:0)

Node构造函数中......

Node(int input)
{

...你无条件地调用Node构造函数......

    Node ^node = gcnew Node(input);

这不能很好地结束。为什么要在Node构造函数中构建新的Node?调用Node构造函数时,会调用它来构造*this对象 - 而不是创建新的Node,您应该初始化当前实例。

同样在您的insertNode成员函数中 - 它已经可以访问*this对象;没有必要通过单独的参数传递它。