二叉树中的最大数字

时间:2011-11-18 21:39:47

标签: c++ binary-tree

所以我尝试在我的二叉树中找到最大的数字,这样我就可以删除它,但它不会运行,插入我搜索最大数字的部分,树工作正常,没有这部分。

以下是我现在获得的代码:

#include <iostream>
#include <string>


using namespace std;


template<class T>
class BinaryTree
{

struct Node
    {
        T data;
        Node* lChildptr;
        Node* rChildptr;

        Node(T dataNew)
        {
            data = dataNew;
            lChildptr = NULL;
            rChildptr = NULL;

        }
    };
private:
    Node* root; 

        void Insert(T newData, Node* &theRoot)
        {
            if(theRoot == NULL) 
            {
                theRoot = new Node(newData);
                return;
            }

            if(newData < theRoot->data)  
                Insert(newData, theRoot->lChildptr);
            else
                Insert(newData, theRoot->rChildptr);;
        }

        void PrintTree(Node* theRoot)
        {
            if(theRoot != NULL)
            {
                PrintTree(theRoot->lChildptr);
                cout<< theRoot->data<<" \n";;
                PrintTree(theRoot->rChildptr);
            }
        }
        void Largest( Node* theRoot, T max)
        {
            if ( theRoot == null )
            return -1;

            int left = Largest(theRoot->lChildptr);
            int right = Largest ( theRoot->rChildptr);
        if( theRoot->data > left && theRoot->data > right )
        return theRoot->data;
             else
       return max ( left, right );
};

    public:
        BinaryTree()
        {
            root = NULL;
        }

        void AddItem(T newData)
        {
            Insert(newData, root);
        }

        void PrintTree()
        {
            PrintTree(root);
        }
        void Largest()
        {
            Largest(root);
        }
    };

    int main()
    {
        BinaryTree<int> *myBT = new BinaryTree<int>();
        myBT->AddItem(2);
        myBT->AddItem(5);
        myBT->AddItem(1);
        myBT->AddItem(10);
        myBT->AddItem(8);
        myBT->PrintTree();
        myBT->Largest();
    } 

3 个答案:

答案 0 :(得分:1)

树中最大的数字将是树中最右边的节点。所以继续往下走,直到你再也不能。

//删除了代码,因为这可能是一个家庭作业问题

答案 1 :(得分:0)

似乎你在删除最大的右孩子时撒谎。

除了返回类型和arities之外,你使它有点过于复杂。 Wikipedia说:

  

节点的左子树仅包含键小于节点键的节点。

答案 2 :(得分:0)

由于二叉搜索树表示左子节点小于节点,因此右子节点大于或等于节点。

我认为你只需要找到最合适的孩子来找到最大的节点。

无论如何,你有2个版本BinaryTree :: Largest,一个带0个参数,一个带2个参数。

在void BinaryTree :: Largest()中,你调用Largest(root),但是没有Largest只接受一个参数。也许您打算传递一个模板对象?

我看到的另一个问题是另一个Largest函数返回void而不是一个数字,并使用模板对象(max),就像它不是一个函数一样(在你的例子中它是一个int)。稍后返回模板,当函数声明它返回void时。

我建议您更改Largest以返回模板而不是void。

T Largest( Node* theRoot)//<-- Notice returning of the template, not void
{
    if ( theRoot == null )
        return -1;

    T left = Largest(theRoot->lChildptr);
    T right = Largest ( theRoot->rChildptr);
    if( theRoot->data > left && theRoot->data > right )
        return theRoot->data;
    else if (left < right)//<-- max was not a function, manual compare
        return right;
    else
        return left;
}//<--You were missing a "}" here too

//...

T Largest()
{
    return Largest(root);
}