我正在试图弄清楚如何在托管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;
}
答案 0 :(得分:0)
在Node
构造函数中......
Node(int input)
{
...你无条件地调用Node
构造函数......
Node ^node = gcnew Node(input);
这不能很好地结束。为什么要在Node
构造函数中构建新的Node
?调用Node
构造函数时,会调用它来构造*this
对象 - 而不是创建新的Node
,您应该初始化当前实例。
同样在您的insertNode
成员函数中 - 它已经可以访问*this
对象;没有必要通过单独的参数传递它。