我试图创建一个简单的二叉树,然后向树中添加几个整数,最后打印出树的高度。虽然在调用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);。 (而且theDatavalue有什么区别?您需要为此区分字段吗?)
BinaryTree *tree中的main可以只是一个对象,不需要动态分配(BinaryTree tree;,然后将所有tree->更改为tree.)。

09-06 17:46