データ構造(XI)
私は自分自身を見つけるようにすることを、学習経験とプロセスにおけるデータ構造とアルゴリズムの知識を仕上げ、そして私はあなたが誰と共有することができると思います。
- 二分探索木 -
1.タイトル説明
ダイナミックなルックアップテーブルのバイナリ検索ツリーが特に有効であるには、ランダムシーケンスは、バイナリ検索ツリーを構築することにより、シーケンスに注文することができる、ツリーがランダム発注プロセスの配列を構築するプロセスです。新しいノードが挿入されるたびには、バイナリ検索ツリーの新しいリーフノードであり、挿入操作は、他のノードを移動させることなく行われる、すなわち、非空の空から唯一つのノードポインタ変更ことができます。
ここでは、探求し、バイナリ出力のシーケンスを確立したいです。
1.1入力
唯一の行は、複数桁の数字を含む、スペースで区切られました。(数字は重なっていてもよいです)
1.2出力
プリアンブルの確立の結果として出力ラインは、デジタル入力のバイナリ検索ツリーを移動しました。
1.3サンプルの入力と出力
サンプル入力
41467334500169 724,478,358,962,464 705,145,281,827,961 491,995,942,827,436
サンプル出力
41467334169145 281,358,464,436,500 478 491 724 705 962,827,961,942,995
2.コードの実装
C
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int date;
struct node *left;
struct node *right;
}node;
//建立树
node *insert(node *root,int x)
{
//第一个节点,初始化
if(root==NULL)
{
root=(node*)malloc(sizeof(node));
root->date=x;
root->left=NULL;
root->right=NULL;
return root;
}
if(x==root->date)
return root;
if(x<root->date)
{
root->left=insert(root->left,x);
}
else
{
root->right=insert(root->right,x);
}
return root;
}
//前序遍历
void pre(node *root)
{
if(root==NULL)
return;
printf("%d ",root->date);
pre(root->left);
pre(root->right);
}
int main ()
{
int num[1000]={0};
node *root=NULL;
for(int g=0;g<100;g++)
{
scanf("%d",&num[g]);
if(num[g]==0)
break;
root=insert(root,num[g]);
}
pre(root);
return 0;
}
3.コード説明
この質問を検索するバイナリ検索ツリーの定義に従った順序トラバーサルの前に順番に成果、注意を払うことができ、知識の木を調べることです。
三トラバーサルルールをクリックし導入鑑賞。
バイナリ検索ツリー:
- その左部分木が空でない場合、その後、すべてのノードは、左部分木の値です以下根の値。
- その右のサブツリーが空でない場合は、右部分木のノードの値が全てですより大きい根の値。
- その左と右のサブツリーもバイナリ・ソートツリーです。
バイナリ検索ツリー関連のアルゴリズム:
-
(プロセス内のバイナリツリーで見つけるのX B)探している相手:
- bは空の木である場合、検索が失敗した場合、または:
- xはデータのルート・ドメインの値bと等しい場合、検索は成功し、そうでない場合:
- データフィールドは、左サブツリー検索、少ないルートノードxの値b未満である場合に、そうでない場合:
- 右のサブツリーを検索します。
-
インサート(バイナリツリーノードの手順に挿入B):
- bが空の場合ツリーノードは、他のルートインサートと呼ぶことにします。
- S->データ値Bがデータ・フィールドのルートノードに等しい場合、そうでない場合、返されます。
- S->データ値Bがルートノードのデータフィールドよりも小さい場合、ノードは、Sが左サブツリーに挿入置くによって別段の指摘しました:
- ノードは、右サブツリーに挿入sが指します。