なぜ手がかりバイナリツリー?
バイナリリスト格納されたバイナリツリー構造として使用する場合、あなたは簡単に左の子ノードを見つけることができます。しかし、一般的に、ノードは、特定のトラバーサル順序先行および後続ノードに直接見つけることができません。
進数前に学んだ中空チェーンのポインタフィールド:バイナリ鎖が有するn個のノード、N + 1つのポインタフィールドの合計が空であります
スレッドのバイナリ基本的な概念
バイナリヌルリンクリストポインタフィールドを使用します:
代わりに左の子ポインタのノードの左の子が空の場合、空のフィールドその前身を指します;右の子ノードは、右の子ポインタへの空のフィールド空の場合その後継者へのポイント;
この種変更ポインタへ呼ばれます手掛かり。
プラストレイルは、バイナリツリーと呼ばれますスレッド・バイナリ。
それが呼ばれるネジ付きバイナリのいくつかの種類になるというバイナリツリートラバーサル順序に従ってプロセスのスレッド表示。
lchildそして最後にrchildポインタを区別するために、子ポインタまたは先行または後続のポインタは、バイナリのリストを周りに向けられます各ノード2つの追加のフラグとフィールドLTAG RTAGそして大会:
の形でノード:
スレッドのバイナリ表現ストレージ
typedef struct BiThrNode{
int data;
int ltag,rtag;//左右标志
struct BiThrNode *lchild,rchild;//左右孩子指针
}BiThrNode,*BiThrTree;
例えば、手がかりの3種類のバイナリツリーを理解します
前任者と後継者、左右の子供たちに青い実線に赤い点線ポイント
1)予約限定バイナリーツリートレイル:
一次配列は、ABCDEの
ように示され:
2)ねじ付きバイナリシーケンスで:
順序シーケンスにおいて:BCAED
図である。
3)バイナリツリーへの手がかりをフォロー:
その後の配列:C B EDAは、
として示さ。
なぜ追加のヘッドノード?
以下の図ねじ付きバイナリシーケンスで
順序内でのHDIBEAFCG
これは、図から見た、しかし、また、残りの2つのヌルポインタれます。従ってフローティング状態を回避し、操作を容易にするために、我々は、ヘッダーノードを追加します。
動作ヘッドノード:
1)データフィールドが残されるブランク、LTAG = 0、lchildルート点
最後のトラバーサル順序ノード2)RTAG = 1、rchild点
3)配列内の最初のノードをトラバース(NO前駆体)と視野点rchildヘッドノードのlchildノード(NO後継)の最後のフィールド。
図に示す最終結果:
循環リンクリストとして同じように、あなたは、操作がより便利に、任意のノードにアクセスすることができます。
バイナリツリートラバーサルシーケンス手がかり
宣言ストアに、言いました:
typedef struct BiThrNode{
int data;
int ltag,rtag;//左右标志
struct BiThrNode *lchild,rchild;//左右孩子指针
}BiThrNode,*BiThrTree;
[説明]アルゴリズム
void InOrderTraverse_Thr(BiThrTree T)
{//T指向头结点,头结点的左链lchild指向根结点
//中序遍历二叉线索树T的非递归算法,对每个数据元素直接输出
BiThrNode *p=T->lchild; //p指向根结点
while(p!=T) //空树或遍历结束时,p==T
{
while(p->ltag==0)
p=p->lchild; //沿着左孩子向下
cout<<p->data; //访问其左子树为空的结点
while(p->rtag==1||p->rchild!=T)
{
p=p->rchild; //沿右线索访问后继结点
cout<<p->data;
}
p=p->rchild; //转向p的右子树
}
}
時間計算量はO(N)のねじバイナリトラバーサル再帰必要がスタック実装されていないので、空間的複雑度は、O(1)であります
コンテンツ参照:「データ構造」ヤン魏ミン