0

追加するアイテムのみを指定して、バイナリ ツリーにアイテムを追加する必要があります。

これが私が与えられたコードです:

void BinaryTree::add(Data * data) {
    if (root == NULL) {
        root = new BinaryTreeNode(data);
    }
    else {
        root->add(data);
    }
}

ここで、は aとして定義されたroota のプライベート変数です。BinaryTreeBinaryTreeNode

メソッドを実装する必要があります。

void BinaryTreeNode::add(Data * data);

aBinaryTreeNodeは次のとおりです。

class BinaryTreeNode {
public:
    Data * nodeData;
    BinaryTreeNode * left;
    BinaryTreeNode * right;

    /**
     * Constructor
     */
    BinaryTreeNode(
        Data * data,
        BinaryTreeNode * left = NULL,
        BinaryTreeNode *right = NULL
    )
      : nodeData(data), left(left), right(right)
    { }

    // ...

これを再帰的に行いたいのですが、追加するデータのみを渡す場合の方法については確信が持てません。

うまくいかない私の考えは次のとおりです。

void BinaryTreeNode::add(Data * newData) {
    BinaryTreeNode * temp = this;
    if (temp == NULL) {
        temp->nodeData = newData;
    } else {
        if (newData->compareTo(nodeData) < 0) {
            temp->left->add(newData);
        } else {
            temp->right->add(newData);
        }
    }
}
4

2 に答える 2

2

temp をこれに設定し、それを NULL と比較しています。これは NULL であってはなりません。左と右がNULLかどうかを確認する必要があります。

于 2011-10-16T22:21:32.813 に答える
0

二分木、少なくとも私がどのように実装するかを知っている方法には、2つのオブジェクトを持つ次のようなものが含まれます。1つはtreenodeオブジェクトを含み、もう1つはツリー全体のインターフェースとして機能します。

 class cBinaryTree {

 public:
 bool insert(int inData);
 //Other operations

 private:
 cBinaryTreeNode* root;
 bool leftInsertion;
 cBinaryTreeNode* getRoot() { return root; }

入力データの実際の値を比較し、それに応じて配置しているため、これは二分探索木と見なされます。次に、挿入関数は次のように記述できます。

bool cBinaryTree::insert(int inData) {

//handle case if its first node.
cBinaryTreeNode *Parent = getInsertionNodePosition(getRoot(), inData);
cBinaryTreeNode *newNode = createNewNode(inData);

if(leftInsertion) //insert into left. add return statement
    Parent->setLeftChild() = newNode;
else //insert into right 
}

再帰ルックアップ関数は次のようになります

cBinaryTreeNode* getInsertionNodePosition(cBinaryTreeNode* node,int inData) {

//Check left subtree and proceed from there.
if(inData < node->getData()) {
    if(node->getLeftChild() == NULL)  {             
        leftInsertion = true;
        return node;
    }
    else {
        node = node->getLeftChild();
        return getInsertionNodePosition(node, inData);
    }
}
    //Similarly Check right subtree.

お役に立てれば。

于 2011-10-17T00:24:18.173 に答える