web-dev-qa-db-ja.com

二分木実装C ++

二分木の挿入:

#include "stdafx.h"
#include <iostream>

using namespace std;

struct TreeNode {
  int value;
  TreeNode* left;
  TreeNode* right;
};

struct TreeType {
  TreeNode* root;

  void insert(TreeNode* tree, int item);

  void insertItem(int value) {
    insert(root, value);
  }
};

void TreeType::insert(TreeNode* tree, int number) {
  if (tree == NULL) {
    tree = new TreeNode;
    tree->left = NULL;
    tree->right = NULL;
    tree->value = number;
    cout << "DONE";
  } else if (number < tree->value) {
    insert(tree->left, number);
  } else {
    insert(tree->right, number);
  }
}

int main() {
  TreeType* MyTree = new TreeType;
  MyTree->insertItem(8);

  return 0;
}

私は現在C++でデータ構造を学習しています。これは、バイナリツリーに挿入するコードです。

コンパイル後は問題ないように見えますが、このプログラムを実行しようとするとクラッシュしました。

誰かが私がどこが間違っているのか教えてもらえますか?

4
DELIGUCU

ツリーコンストラクターで、ルートポインターをNULLに初期化する必要があります。 NULLとして初期化されることは保証されていません。

Linuxでコンパイルする場合、gdbを使用して、セグメンテーション違反の原因がどこから来ているかを示すことができます。

その他の注意事項:

  1. 新しいノードを割り当てた後、値をrootに戻す必要があります。 C++の基本の1つが欠けているため、これを行っていません。つまり、cに基づいています。そして、cについてのことは、厳密には「値による」関数/メソッド呼び出しパラダイムであるということです。したがって、関数呼び出しのすべてのパラメーターは値によるものです。 rootのメモリアドレスを渡すと、実際にはポインタの値がコピーされます。次に、ローカル値のみを更新します。ルートに割り当てる必要があります。その概念を前から後ろに学びたい場合は、 スタンフォードでのジェリーカインのプログラミングパラダイムコース を見ることを強くお勧めします。
  2. メイン関数では、シンボル名をCamelCaseではなく小文字のままにしておく必要があります。これは、変数とタイプを区別するのに役立ちます(タイプはCamelCaseのままである必要があります)。
  3. TreeType :: insertメソッドでは、treeの代わりに変数tree_nodeを呼び出す必要があります。そうすることで、正しいタイプを反映し、混乱を避けることができます。
  4. 可能な限り、this->rootおよびthis->insert表記を使用してみてください。ローカルスコープのroot変数を誤って作成した場合に正しく解決されるだけでなく、データまたはメソッドが定義されている読者にとっても明確になります。優れたコーディングとはコミュニケーションです。読者が記号がどこを指しているかを理解するのにかかる時間は100〜500ミリ秒だけです。ただし、あいまいさを回避することで蓄積できるわずかな節約は、はるかに明確なソフトウェアになります。あなたの将来の自己(そしてあなたの同僚)はあなたに感謝するでしょう。 http://msmvps.com/blogs/jon_skeet/archive/2013/09/21/career-and-skills-advice.aspx を参照してください。

最後に、私は情報源から学ぶことがいかに重要であるかを十分に誇張することができます。 cまたはc ++を初めて学習する場合は、 http://www.Amazon.com/The-Programming-Language-4th-Edition/dp/032156384 および http ://www.Amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628 。それはあなたに何時間も何時間も節約するでしょう。ソースから学んだ後は、概念のかなりの部分を理解しているので、プログラミングも非常に楽しいものになります。そして、真実は、あなたがそれらにまともなレベルの能力を持っているとき、物事はより楽しいです。

11
Homer6

このようなものを試してください-

 struct Node {
    int Data;
    Node* Left;
    Node* Right; 
};

Node* Find( Node* node, int value )
{
    if( node == NULL )
        return NULL;
    if( node->Data == value )
        return node;
    if( node->Data > value )
        return Find( node->Left, value );
    else
        return Find( node->Right, value );
};

void Insert( Node* node, int value )
{
    if( node == NULL ) {
        node = new Node( value );
        return;
    }
    if( node->Data > value )
        Insert( node->Left, value );
    else
        Insert( node->Right, value );
};
8
Mike Minaev

TreeTypeコンストラクターでは、ルートポイントを明示的にNULLにする必要があると思います。

TreeType::TreeType() {
  root = NULL;
}
1
Abhishek Bansal