我试图创建一个简单的二叉树,然后向树中添加几个整数,最后打印出树的高度。虽然在调用BinaryTree height()方法时似乎会出现堆栈溢出异常。谁能告诉我为什么?请告知我是否实现不正确,因为这是我第一次使用二叉树(我看过一些教程并想出了这段代码)
TreeNode.cpp
#include "TreeNode.h"
TreeNode::TreeNode(int theData)
{
theData = value;
}
BinaryTree.cpp
#include "BinaryTree.h"
BinaryTree::BinaryTree()
{
root = NULL;
}
void BinaryTree::add(int data)
{
if (root != NULL) {
add(root,data);
}
else {
root = new TreeNode(data);
root->value = data;
root->left = NULL;
root->right = NULL;
}
}
int BinaryTree::height()
{
return height(root);
}
void BinaryTree::add(TreeNode * toAdd, int key)
{
if (key < toAdd->value) {
if (toAdd->left != NULL) {
add(toAdd->left, key);
}
else {
toAdd->left = new TreeNode(key);
toAdd->left->value = key;
toAdd->left->left = NULL;
toAdd->left->right = NULL;
}
}
else {
if (toAdd->right != NULL) {
add(toAdd->right, key);
}
else {
toAdd->right = new TreeNode(key);
toAdd->right->value = key;
toAdd->right->left = NULL;
toAdd->right->right = NULL;
}
}
}
int BinaryTree::height(TreeNode *node)
{
if (root == NULL) {
return 0;
}
else {
int leftSide = height(root->left);
int rightSide = height(root->right);
int total = leftSide + rightSide;
return total;
}
}
Main.cpp
#include "BinaryTree.h"
#include <iostream>
int main()
{
BinaryTree *tree = new BinaryTree();
tree->add(10);
tree->add(12);
tree->add(14);
tree->add(15);
tree->add(123);
tree->add(14);
tree->add(12);
tree->add(15);
tree->height();
return 0;
}
最佳答案
height
引用了错误的变量。因为它查看root
,并且完全忽略了node
参数,所以每次对height
的调用都将是相同的,并且递归一旦开始就永远不会结束。
用root
中的node
替换所有对height
的引用。
if (node == nullptr)
return 0;
int leftside = height(node->left);
int rightside = height(node->right);
还有一些无关的东西:
可以将
height
声明为const
,或者使其成为BinaryTree
的静态成员,或者将其移到Node
类中。您具有
TreeNode
的构造函数,该构造函数应处理初始化该类的所有成员。当您分配或添加节点时,应该只包含一行wherever = new TreeNode(key);
。 (而且theData
和value
有什么区别?您需要为此区分字段吗?)BinaryTree *tree
中的main
可以只是一个对象,不需要动态分配(BinaryTree tree;
,然后将所有tree->
更改为tree.
)。