获得二叉树高度时的堆栈溢出异常

问题描述 投票:1回答:1

我正在尝试创建一个简单的二叉树,然后向该树添加几个整数,最后打印出树的高度。虽然在调用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;
}
c++ binary-tree binary-search-tree
1个回答
1
投票

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.)。

© www.soinside.com 2019 - 2024. All rights reserved.