[ツリー] 二分探索木上のいくつかの操作
[qads]
二分探索木 (CNPTK) 内の各ノードのバイナリツリーです, キーロックボタンは、ツリーのすべてのノードをより考慮され、木の必須のすべてのノードの小さいキーを左に.
ここで、二分探索木の例である:
コンテンツ
ツリー構造
ツリーに要素を追加
ツリーを入力してください
[参照]ツリー
ツリー内のノードを探す
ツリー内のノードを削除する
コードの完全なリファレンス
CNPTK上のおかげでキー制約, 発見は、指向になる. さらに, 探索木構造が大幅に高速になったことで. Nは、ツリー内のノードの数、log2N平均約探索コストである場合.
ツリー構造:
typedef int item; //kieu item la kieu nguyen struct Node { item key; //truong key cua du lieu Node *Left, *Right; //con trai va con phai }; typedef Node *Tree; //cay
だから我々は、ツリー構造ツリーを持っている. 今、私たちはアクションの数がかかります.
もっと 1 ツリー内の要素
ツリーの元素Xを追加すると、CNPTKの制約を満たさなければならない. あなたは木の上のさまざまな場所を追加することができます, 私たちは、同じ検索操作を実行することができますので、あなたが最も便利になりますリーフノードを追加する場合. 検索処理が終了すると、より多くの余地を発見する時間である.
int insertNode(Tree &T, item x) // chen 1 Node vao cay { if (T != NULL) { if (T->key == x) return -1; // Node nay da co if (T->key > x) return insertNode(T->Left, x); // chen vao Node trai else if (T->key < x) return insertNode(T->Right, x); // chen vao Node phai } T = (Node *) malloc(sizeof(Node)); if (T == NULL) return 0; // khong du bo nho T->key = x; T->Left = T->Right = NULL; return 1; // ok }
ツリーを入力してください
木が繰り返し挿入を入力している 1 一定の条件にツリーに要素、その後停止. 停止条件入力要素=以下のコードでは、 0.
void CreateTree(Tree &T) // nhap cay { int x; while (1) { printf("Nhap vao Node: "); scanf("%d", &x); if (x == 0) break; // x = 0 thi thoat int check = insertNode(T, x); if (check == -1) printf("Node da ton tai!"); else if (check == 0) printf("Khong du bo nho"); } }
インポートが完了しました, なお、多くのそのような人々が、コードはツリーエントリの種類を知らない :3 (私はそのようになっている)
[参照]ツリー
二分探索木上の操作ブラウズツリーは正確にバイナリツリーのようなものです. 特に間の順序を参照するとき, ボタンシーケンスがキーの昇順に一連のボタンを与えるブラウズ. (1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 20, 23)
void LNR(Tree T) { if(T!=NULL) { LNR(T->Left); printf("%d ",T->key); LNR(T->Right); } }
ツリー内のノードのkey = xを検索
Node* searchKey(Tree T, item x) // tim nut co key x { if (T!=NULL) { if (T->key == x) { Node *P = T; return P;} if (T->key > x) return searchKey(T->Left, x); if (T->key < x) return searchKey(T->Right, x); } return NULL; }
彼自身は、上述した見つけることはかなり非常にシンプルかつ迅速である.
ツリー内のノードのkey = xを削除
ツリーから元素Xを廃棄するCNPTKの制約を確保するため. 持っている 3 終端ノードXの場合に発生することがあり:
– Xはリーフノードである: それは他の要素にフックアップされていないため、単純にXをキャンセル.
– Xのみ 1 とともに (左または右): X Xをキャンセルする前に我々は彼の唯一の子に父親をフック.
– すべてのためのX 2 とともに: これは、Xで直接キャンセルすることはできません十分に持っている 2 とともに. 私は間接的な破壊します. 代わりにXを打ち消す, 我々は、ネットワーク要素Qが見つかります. この要素は、最大値を有する. Qに格納されている情報は、Xでの店舗に転送されます. 後で, ボタンは次のように本当にQをキャンセルされます 2 最初のケース. 問題は、このようなことにQを選択するときにXの代わりに流量Q, 工場はCNPTKまま.
持っている 2 満足な要素:
+ 最小の要素 (一番左の) 苗の上.
+ 最大の要素 (右端の) 左側のツリーに.
選択要素は、プログラミングの気まぐれに完全に依存しているネットワーク要素である. このコードでは、私はほとんどに要素を選択.
int delKey(Tree &T, item x) // xoa nut co key x { if (T==NULL) return 0; else if (T->key > x) return delKey(T->Left, x); else if (T->key < x) return delKey(T->Right, x); else // T->key == x { if (T->Left == NULL) T = T->Right; // Node chi co cay con phai else if (T->Right == NULL) T = T->Left; // Node chi co cay con trai else // Node co ca 2 con { Node *Q = T->Left; while (Q->Right != NULL) { Q = Q->Right; } T->key = Q->key; delKey(T->Left, Q->key); } } return 1; }
リファレンスコード:
#include<stdlib.h> #include<stdio.h> typedef int item; //kieu item la kieu nguyen struct Node { item key; //truong key cua du lieu Node *Left, *Right; //con trai va con phai }; typedef Node *Tree; //cay int insertNode(Tree &T, item x) // chen 1 Node vao cay { if (T != NULL) { if (T->key == x) return -1; // Node nay da co if (T->key > x) return insertNode(T->Left, x); // chen vao Node trai else if (T->key < x) return insertNode(T->Right, x); // chen vao Node phai } T = (Node *) malloc(sizeof(Node)); if (T == NULL) return 0; // khong du bo nho T->key = x; T->Left = T->Right = NULL; return 1; // ok } void CreateTree(Tree &T) // nhap cay { int x; while (1) { printf("Nhap vao Node: "); scanf("%d", &x); if (x == 0) break; // x = 0 thi thoat int check = insertNode(T, x); if (check == -1) printf("Node da ton tai!"); else if (check == 0) printf("Khong du bo nho"); } } // Duyet theo LNR void LNR(Tree T) { if(T!=NULL) { LNR(T->Left); printf("%d ",T->key); LNR(T->Right); } } Node* searchKey(Tree T, item x) // tim nut co key x { if (T!=NULL) { if (T->key == x) { Node *P = T; return P;} if (T->key > x) return searchKey(T->Left, x); if (T->key < x) return searchKey(T->Right, x); } return NULL; } int delKey(Tree &T, item x) // xoa nut co key x { if (T==NULL) return 0; else if (T->key > x) return delKey(T->Left, x); else if (T->key < x) return delKey(T->Right, x); else // T->key == x { if (T->Left == NULL) T = T->Right; // Node chi co cay con phai else if (T->Right == NULL) T = T->Left; // Node chi co cay con trai else // Node co ca 2 con { Node *Q = T->Left; while (Q->Right != NULL) { Q = Q->Right; } T->key = Q->key; delKey(T->Left, Q->key); } } return 1; } int main() { Tree T; T=NULL; //Tao cay rong CreateTree(T); //Nhap cay //duyet cay printf("Duyet cay theo LNR: \n"); LNR(T); printf("\n"); Node *P; item x; printf("Nhap vao key can tim: "); scanf("%d", &x); P = searchKey(T, x); if (P != NULL) printf("Tim thay key %d\n", P->key); else printf("Key %d khong co trong cay\n", x); if (delKey(T, x)) printf("Xoa thanh cong\n"); else printf("Khong tim thay key %d can xoan", x); printf("Duyet cay theo LNR: \n"); LNR(T); printf("\n"); return 0; }
続きを読む: 二分探索木にバイナリツリーをジャンプ
グッドブログ! 私は実際にそれが私の目に優しいどのように愛し、データがよく書かれている. 私は新しいポストがなされたときはいつでも、私は通知する方法を疑問に思って. 私は、トリックを行う必要があり、あなたのフィードを購読している! 良い一日を! efdecfbbekke
どうもありがとうございました. あなたは私のブログを気に取る. あなたがワードプレスのアカウントを持っていると私に従うしたい場合, あなたがボタンをクリックすることができます “続く” 上部の:
または、ホーム·ページをバックアップし、一番下に見ることができます. あなたのメールアドレスを入力し、ボタンをクリックします “サブスクライブ”. 新しい投稿が行われたときはいつでも、私はあなたの電子メールに送信する:
彼は私がjava.nhungによってコードを理解していないことを私に尋ねました 1 スペースは= Tであります (ノード *) のmalloc(はsizeof(ノード)); 何を考えて?
私はTNODEルートを身震いし、 ;
クラスTNODE{
intデータ;
TNODE左,右;
TNODE(int型のx){
データ= xで;
左=右=はnull;
}
TNODE(int型のx,TNODE LL,TNODEのRR){
データ= xで;
左= 11;
右= RR;
}
}
パブリッククラスデモ {
TNODEルート;
int型insertNode(TNODE T,int型のx){
もし(T!= nullを){
もし(T.data == X)
リターン -1;
ほかに{
もし(T.data<X)
insertNodeを返します(T.right,X);
ほかに
insertNodeを返します(T.left,X);
}
}
もし (T == nullを) リターン 0; // 十分なメモリがありません
T.data = X;
T.left = T.right = NULL;
リターン 1; // OK
}
/*int型の挿入(int型のx){
insertNodeを返します(ルート,X);
}*/
無効nhapcay(TNODE T){
int型のx;
スキャナキロバイト=新しいスキャナ(System.in);
同時に(真){
System.out.print("x= ");
X = kb.nextInt();
もし(X == 0)
ブレーク;
int型のチェック= insertNode(T,X);
もし (チェック== -1) のSystem.out.println("Node da ton tai!");
それ以外の場合 (チェック== 0) のSystem.out.println("Khong du bo nho");
}
}
無効nhap(){
nhapcay(ルート);
}
無効xuat(TNODE T){
xuat(T.left);
System.out.print(T.data);
xuat(T.right);
}
ボイドduyet(){
xuat(ルート);
}
公共の静的な無効メイン(文字列[] 早いです){
=新しいデモをデモ();
a.nhap();
a.duyet();
}
}
つまり、ポインタTのNHEに対するメモリアロケーション.
ノードTのために、それが割り当てられたメモリは、構造体のノードサイズのサイズの大きさであるNHEあなたを !!
しない理由 1 すべてえっ、彼をバイナリーCによって生まれました..!!
このような調整の組み合わせか:
子供たちは、 1 最適な記事、しかしまだ最適か分かりません。?
=)) それを行います. 限られた時間, 私はすべてを書きません.
イブニング..!!
このような状況であります:
đây là code in ra chỉnh hợp chập k của n, nhìn hơi cùi bắp..^^
và vấn đề là hai vòng FOR () em đã đánh dấu k biết làm cách nào để tối ưu hóa..!
Đã ngưỡng mộ võ công tiền bối lâu nay, mong cao nhân chỉ giáo phương cách, nên dùng cái gì để cải tiến….!!
int型のK,N;
int型A[200];
void ChinhHop ( int j){
int dem =0;
もし (j== k){
// のために (int型のi = 0 ; で < へ – 1; 私 ){
// のために(int j = i + 1; J < へ; J )
もし ( ザ·[で] == a[J] )
++;
}
もし (dem == 0 ){
のために (I = 0 int型 ; で<へ ; 私 ){
printfの ("%d ", ザ·[で]) ;
}
printfの("\n");
}
dem=0;
}ほかに{
のために (I = 1 int型 ; で<= N ; 私 ){
ザ·[J]= I;
ChinhHop (j+1);
}
}
}
メインint型 (){
scanf関数 ("%d%d",&へ,&N);
ChinhHop ( 0 );
リターン 0;
}
オファー!
最初の電子は、彼のブログで程度のシェアに感謝.
月曜日, プログラミングのための方法を学習についての詳細を共有することができます, 進行する方法を学習の方法はそうではありません? Eは尋ねます, プログラミングで, 最も重要なことは、サー? Eそれほど賢くありません, 良い学校はプログラマになるかどうかは、そうではありません? 🙁
一種 3, Fたぶん良いと便利なことをいくつかの学習を共有するための文書を転送します.
EのおかげでA A! 🙂
プログラミングを学ぶためにどのように、それぞれの人が道を持っています, 能力に応じて、, 以下のような… 多くの場合、他の人のコードを参照してください (または別のコードを参照してください) その後、コード再び, 自分自身に同じ練習を尋ねることによって、そのコードに編集し[OK]を実行するには、仕上げコード…
プログラミングでは、それにも依存します. 最も重要なことは、常に学習 & 新しいものを作ります. そのようなアプリケーションの開発などのいくつかの領域は、そのアルゴリズムを追加する必要があります.
彼らは知らない賢い方法をするときに、新しい学校…
彼女の全体のGoogleはどこにあります… 常に読んだことがありません…
OK
cho em hỏi sao cứ nhập X mãi thế anh… :3
Cái này là nhập đến khi nào nhập số 0 thì dừng lại mà.
🙂 @@@… em mới vào nghề nên không hiểu lắm.. そこ… thank anh 😛
e cảm ơn anh vì bài viết rất bổ ích với e. nhưng khi e chạy chương trình của anh, あなたがエラーを見るためにツリーを参照するとき場合にノードは、左と右の両方があります. 彼の答えは、電子の先生を支援されていません.
あなたが見しようとしていること. その後、[OK]をクリックして実行をテストすることをあきらめます.
彼は私に尋ねました , 入院の数で 0 停止しています , 私は、ツリー内の要素を持ちたいです 0 その後、どのようにA ? おかげであなたを
その後、いずれかの特定の番号を入力します. 例えば、非常に大きいまたは非常に小さいNOA. 999999999 そのような.
サー , 私はあなたが、たとえば意味します : 私はでツリーを望みます 2 3 4 0 5 6 7;
その後、彼のコードに応じた場合、それだけで閲覧します 2 3 4 退職先生 , あなたが助けを願って !
右その後、エントリを作成するため、 0 ことを停止され、. あなたが条件を変更停止することはokです
OK , オフラインありがとうございました !!!
eは愛するを尋ねました,,そのáのInsertNodeで,,今私は再帰ループの形式を使用することはもう使用しないでください,,参照の星? そして、ZIP形式はどのように繰り返しています?
これはおそらくですが、私はとてもよく、あなたはもう知っていない今まで行っていません.
英国は見直し削除されたノードは、彼を行きます. 示すように、木を想定すると、. あなたはノードを削除した場合(12) その後
P - > ノード(12);
S-> ノード(12);
Q-> ノード(9);
そして、P->キー= 9;
S->右 (ノード(23)) = Q->左 (NULL)
だから、ノードを取ります(23) ノード(20) R A
ありがとう. Mình đã sửa lỗi nhé.
プログラムはちょうど入力した場合にノードで木に機能を削除 3 任意の数 (例えば: 3, 4, 5) プログラムは失敗します.
ありがとう. Mình đã sửa lỗi nhé.
ハムは、ノードを削除* S = T, *Q = S->左;
// SはQの親であります, Qラ・ノードは、スパイシーなカニの息子Pの退色します
同時に (Q->右 != NULL)
{
S = Q;
Q = Q->右;
}
P->キー= Q->キー;
S->右= Q->左;
Qを削除;
問題を抱えています. 実行エラー
ありがとう. Mình đã sửa lỗi nhé.
あなたは、BT助けるためにあなたにこのガイドを欠場
各ノードのお金のためのバイナリツリー検索が整数であります
ザ·. 2本の苗の値とその値がそれを生きるどのように多くの木ゴーストボタンの夜景も素数であります
b.tim苗最大のT合計 ( あなたが置く木を見つけます ) hẩy chị biết giá trị tổng tìm đuợc
code phần delete key cua anh nếu xét trường hợp cây con bên trái trỏ đến phải là NULL thì bị sai, anh xem có đúng không. Thank anh!
有難うございます。. Mình sẽ kiểm tra lại 😉
もしもし. 私は顎insertNodeをお願いしたかったです.
T == NULLは、ノードTを作成するときに値を割り当てますT->キー, T->左とT->右, しかし、私は他のノードのノードフックでこのコマンドが表示されません. あなたは説明することができません?
場合、すなわち、中空の木T == NULL, ツリーは、それがオリジナルであるため、単にだけでT値を挿入して、空であります. 一方、左右にはNULLは何も理解しないだろう.
ありがとう. あなたはより明確にそれを説明することができません? そのような具体的な例を試してみてください.
そのような物は最も明白なあなたであります. インサートは彼のオリジナルを挿入します。初期中空ツリー. 息子, 子どもたちは、ヌルを受けなければなりません.
しかし、私のコード内の別のノードと、このノードのフックとの間の接続が表示されません (他の二つのノードのNULL) それでも動作します. あなたはより多くのではない説明することができます?
常にネット初期の木, すなわちT = NULL. T = NULL TがX1の値を認識しなければならないので、それの最初の素子X1を挿入, T->左= T-右= NULL. 次回挿入T != NULLその後、, そうL-> BT挿入X2次ツリーの値に応じて (x2の場合 < x1), hay T->右 (X2> X1). 一方、再帰insertNoteを思い出します(T->左) (挿入された左と仮定), それはT->左があると考えている間 1 新しいTとそう.
ウェイター, ZIPカウントボタン, 樹高NPTK先生NTN? K分木の品種があります。?
ハチミツのように. 🙂
作者に感謝,私にとって非常にやりがいの記事!
一部のInsertNodeとして宣言なぜ自問してみてください:
int型insertNode(ツリー &T, 項目X)
これではありません:
int型insertNode(ツリーT, 項目X)
から 2 ノーがあるように使用,2 どのように異なっ?
ありがとう!
持っている &Tはアウト機能Tの後に木の値を保存することです. 道の場合 2 その後、ツリーアウト関数Tの後にアイテムを挿入しないで残ります.
やあ、お兄さん,
関数delKeyで(ツリー &T, 項目X) {} ラインで `S->右= Q->左;`平均先生. 今回
Qは、ツリーの果実の右ノードであります, そしてSはQの親であります.
ありがとう. Mình đã sửa lỗi nhé.
コード内のノードを削除します, もしX ==(ツリーの最後のノード) 最後のノードは、NULLを指しています, しかし、忘れてしまったメモリ領域がなくなってその場所を解放しました.
一番上のボタンのうちまさか 1 ではない彼の品物.
có rất nhiều blog nhưng mình toàn tự học trên blog của bạn vì viết rất dễ hiểu, dễ tiếp thu
ありがとうNHE.