尝试执行以下操作时遇到问题:
(1)在原始树的根的左侧子树中找到最大的信息字段
(2)在原始树的根的右子树中找到最小的信息字段。

我的代码可以编译,但是执行时会出错,并且我不清楚maxleftsubtree()和minrightsubtree()函数中正在发生什么。任何建议,将不胜感激。

我当前的代码:

#include <iostream>
#include <string>

using namespace std;

class Tnode {
    public:
        Tnode *left;
        string info;
        Tnode *right;
        Tnode(string info = "", Tnode* left = NULL, Tnode* right = NULL) :
            info(info), left(left), right(right) {}
};
class BST {
    public:
        BST() : theroot(NULL) {}
        void insert(string x);
        void inorderprint();
        void preorderprint();
        void postorderprint();
        void maxstring();
        void minstring();
        void maxleftsubtree();
        void minrightsubtree();
    private:
        void inorderprint(Tnode *p);
        void preorderprint(Tnode *p);
        void postorderprint(Tnode *p);
        void maxstring(Tnode *p);
        void minstring(Tnode *p);
        void maxleftsubtree(Tnode *p);
        void minrightsubtree(Tnode *p);
        void insertleft(Tnode *place, string newval);
        void insertright(Tnode *place, string newval);
        Tnode *theroot;
};

// add a new node (with x as info) to tree that has theroot as root
void BST::insert(string x)
{
    // if the tree is initially empty, put x at the root
    if (theroot==NULL) {
        theroot = new Tnode(x);
        return;
    }

    Tnode *p, *q;

    // otherwise, find where x belongs in the tree
    p = theroot;
    q = theroot;
    while ( q != NULL) {
        p = q;
        if (x < p-> info)
            q = p-> left;
        else
            q = p-> right;
    }

    // to get here, we found the correct place to store x,
    // as a child of node p        Q: is it left or right?

    if (x < p-> info)
        insertleft(p,x);
    else
        insertright(p,x);

    return;

}

//insert a new node (with info newval) as left child of place
void BST::insertleft(Tnode *place, string newval)
{
    Tnode *p = new Tnode(newval);

    place -> left = p;
    return;

}

//insert a new node (with info newval) as right child of place
void BST::insertright(Tnode *place, string newval)
{
    Tnode *p = new Tnode(newval);

    place -> right = p;
    return;

}
......................
...............
...............

//
//
void BST::maxleftsubtree()
{
    maxleftsubtree(theroot);
}

//
//
void BST::minrightsubtree()
{
    minrightsubtree(theroot);
}

.....................................
.................................
.........................

//
//
void BST::maxleftsubtree(Tnode *p)
{
    while (p -> left)
        p = p -> right;
    cout << p -> info << " \n";
    return;
}

//
//
void BST::minrightsubtree(Tnode *p)
{
    while (p -> right)
        p = p -> left;
    cout << p -> info << " \n";
    return;
}

最佳答案

您的maxleftsubtreemaxtrightsubtree)函数存在错误。您首先应该选择根的左(右)子树,然后沿着右(左)分支走到终点。这是修改后的版本:

void BST::maxleftsubtree(Tnode *p)
{
    Tnode* left = NULL;
    if (p != NULL) {
        left = p->left;
    }
    if (left != NULL) {
        while (left->right)
            left = left -> right;
        cout << left -> info << " \n";
    }
    return;
}

关于c++ - 原始树的子树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8380253/

10-12 04:24