0

以下のBSTコードを参照してください。「5」のみを出力します。私は何を間違えましたか?

#include <iostream>

class bst {
 public:
  bst(const int& numb) : root(new node(numb)) {}

  void insert(const int& numb) {
    root->insert(new node(numb), root);
  }

  void inorder() {
    root->inorder(root);
  }

 private:
  class node {
   public:
    node(const int& numb) : left(NULL), right(NULL) {
      value = numb;
    }

    void insert(node* insertion, node* position) {
      if (position == NULL) position = insertion;
      else if (insertion->value > position->value)
        insert(insertion, position->right);
      else if (insertion->value < position->value)
        insert(insertion, position->left);
    }

    void inorder(node* tree) {
      if (tree == NULL)
        return;
      inorder(tree->left);
      std::cout << tree->value << std::endl;
      inorder(tree->right); 
    }
  private:
    node* left;
    node* right;
    int value;
  };

  node* root;
};

int main() {
  bst tree(5);
  tree.insert(4);
  tree.insert(2);
  tree.insert(10);
  tree.insert(14);
  tree.inorder();
  return 0;
}
4

3 に答える 3

1

参照を使用:

void insert(node * insert、node *&position)

void inorder(node *&tree){

于 2012-06-02T04:35:33.807 に答える
1

leftこれは、のフィールドとrightフィールドの値を設定したことがないためですroot

どこかで、与えられたノードについて、n

n->left = ...
n->right = ...

あなたはこれをしたことはありません。そのため、最終的に単一のノードツリーになりました。ルートには2つのnullの子があります。

これについても卑劣になる可能性があります。@user1431015が提案することを実行し、参照によって子ポインターを渡すと、参照パラメーター(position)への割り当てでうまくいきます。あなたがしたように、それらを値で渡すと、ローカル変数にのみ割り当てられ、ツリー自体には割り当てられません。

于 2012-06-02T04:41:02.260 に答える
1

ほとんどの場合、挿入によって何も実行されなくなることはありません。再帰の基本ケースは次のとおりです。

void insert(node* insertion, node* position) {
     if (position == NULL) position = insertion;

ただし、すべての「位置」はローカルスコープのポインタ値です。関数が終了すると、それに割り当てても効果はありません。

あなたがする必要があるのは、位置パラメータをポインタへの参照にすることです。つまり、タイプを作成しnode*&ます。次に、関数を終了した後、割り当てが固定されます。

于 2012-06-02T04:41:12.837 に答える