二分木の挿入:
#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++でデータ構造を学習しています。これは、バイナリツリーに挿入するコードです。
コンパイル後は問題ないように見えますが、このプログラムを実行しようとするとクラッシュしました。
誰かが私がどこが間違っているのか教えてもらえますか?
ツリーコンストラクターで、ルートポインターをNULLに初期化する必要があります。 NULLとして初期化されることは保証されていません。
Linuxでコンパイルする場合、gdbを使用して、セグメンテーション違反の原因がどこから来ているかを示すことができます。
その他の注意事項:
root
に戻す必要があります。 C++の基本の1つが欠けているため、これを行っていません。つまり、cに基づいています。そして、cについてのことは、厳密には「値による」関数/メソッド呼び出しパラダイムであるということです。したがって、関数呼び出しのすべてのパラメーターは値によるものです。 rootのメモリアドレスを渡すと、実際にはポインタの値がコピーされます。次に、ローカル値のみを更新します。ルートに割り当てる必要があります。その概念を前から後ろに学びたい場合は、 スタンフォードでのジェリーカインのプログラミングパラダイムコース を見ることを強くお勧めします。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 。それはあなたに何時間も何時間も節約するでしょう。ソースから学んだ後は、概念のかなりの部分を理解しているので、プログラミングも非常に楽しいものになります。そして、真実は、あなたがそれらにまともなレベルの能力を持っているとき、物事はより楽しいです。
このようなものを試してください-
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 );
};
TreeTypeコンストラクターでは、ルートポイントを明示的にNULLにする必要があると思います。
TreeType::TreeType() {
root = NULL;
}