【データ構造】二分木の考え方

目次

二分木の概念::

                        1. ツリーの概念と構造

                        2. ツリー表現

                        3.実際のツリーの適用

                        4. 二分木の概念と構造

                        5. 完全二分木と完全二分木

                        6. 二分木の性質

                        7. 二分木の格納構造

二分木の概念::

1. ツリーの概念と構造

ツリーの概念:

ツリーは非線形データ構造であり、有限の関係を持つ n (n>=0) 個の有限ノードのセットです。根が上を向き、葉が下を向いている逆さまの木のように見えることから、ツリーと呼ばれます。

1. ルート ノードと呼ばれる特別なノードがあり、ルート ノードには先行ノードがない
2. ルート ノードを除いて、残りは M (M>0) 個の素集合 T1、T2...Tm に分割されます。各セット Ti (1<=i<=m) は、構造がツリーに類似したサブツリーです。各サブツリーのルート ノードには先行ノードが 1 つだけあり、後続ノードが 0 個以上ある可能性があるため、ツリーは再帰的に定義されます。


注: ツリー構造では、サブツリー間に交差があってはなりません。それ以外の場合、ツリー構造ではありません。 

 

ツリーの関連概念: 

1. ノードの次数:ノードに含まれるサブツリーの数は、上の図に示すように、ノードの次数と呼ばれます: A の次数は 6 2.
リーフ ノードまたはターミナル ノード:次数のノード上の図に示すように、0 はリーフ ノードと呼ばれます。B、C、H、I などのノードはリーフ ノードです
上の図では、D、E、F、G... などのノードが分岐ノード
4 です。親ノード:ノードに子ノードが含まれる場合、このノードは、上の図に示すように、その子ノードの親ノードと呼ばれます。 A は B の親ノードです。
5. 子ノード:サブツリーのルート ノードを含むノードをノードと呼びます。
6. 兄弟上の図に示すように、同じ親ノードを持つノードは兄弟ノードと呼ばれます。B はAの子ノード
7. ツリーの次数:ツリーでは、上の図に示すように、最大​​のノードの次数をツリーの次数と呼びます: ツリーの次数は 6 8. ノードの階層
:開始ルートの定義から、ルートは最初のレイヤーであり、ルートの子ノードは 2 番目のレイヤーであり、以下同様です
9。ツリーの高さまたは深さ:上の図に示すように、ツリー内のノードの最大レベル。 、ツリーの高さは 4
10. カズン ノード:上の図に示すように、親が同じレベルにあるノードはカズンです: H と I はカズン ノードです
11. ノードの祖先:からのブランチ上のすべてのノード上の図に示すように、ノードのルート: A はすべてのノードの祖先
です。 13.
: m (m>0) 個のばらばらな木の集まりは森と呼ばれます。たとえば、和集合検索は木の森です。

ツリー表現:

//静态顺序表存储孩子节点指针
//明确告诉树的度为N
#define N 5
struct TreeNode
{
	int da/ta;
	struct TreeNode* childArr[N];
	int childSize;
};
//动态顺序表存储孩子节点指针 不用定义宏
struct TreeNode
{
	int data;
	struct TreeNode** childArr;
	int childSize;
	int childCapacity;
};

線形テーブルと比較して、ツリー構造はより複雑であり、格納と表現がより面倒です. 値の範囲とノード間の関係を保存する必要があります. 実際には, ツリーを表現する方法はたくさんあります. as: 親表記、子表記、子親表記、子兄弟表記など ここでは、最も一般的に使用される子兄弟表記を簡単に理解できます。

//左孩子右兄弟表示法
//父亲指向左边第一个孩子 孩子之间用兄弟指针链接起来
typedef int DataType;
struct Node
{
	struct Node* firstChild1;//左边第一个孩子节点
	struct Node* pNextBrother;//指向下一个兄弟节点
	DataType data;
};

親の表現:
父の添え字を保存します。その利点は、任意のノードの祖先を見つけるのに便利であり、このデータ構造はクエリに使用されます 

実際のツリーの適用: (ファイル システムのディレクトリ ツリー構造を表します)

2. 二分木の概念と構造

コンセプト:

二分木は、次のようなノードの有限集合です。

1.または空

2. ルート ノードと、左サブツリーおよび右サブツリーと呼ばれる 2 つのバイナリ ツリーで構成されます。

上の図から、次のことがわかります。
    1. 二分木には次数が 2 を超えるノードはありません
    2. 二分木の部分木は左右に分割され、順序を逆にすることはできないため、二分木tree は順序付けられたツリーです
    注: 任意のバイナリ ツリーの場合、次のタイプで構成されます 状況の組み合わせ:

 特別な二分木:
1. 完全な二分木:二分木。各層のノード数が最大値に達すると、二分木は完全な二分木になります。つまり、二分木の層の数がK であり、ノードの総数が 2 ^K - 1 である場合、それは完全な二分木です.
2. 完全な二分木:完全な二分木は非常に効率的なデータ構造であり、完全な二分木は完全な二分木から派生します。二分木. 深さが K でノード数が n の二分木で、各ノードが深さ K の完全二分木で 1 から n までの番号が付けられたノードに対応する場合のみ、完全二分木と呼ばれます。完全二分木は特殊な完全二分木であることに注意してください。
注: 完全なバイナリ ツリーの最初の k-1 層は完全であり、最後の層は完全であるか不満足ですが、左から右に連続している必要があります。1
       ] (最後の層は少なくとも 1 つ、多くても満杯) 

バイナリ ツリーのプロパティ:

1. ルート ノードのレイヤー数が 1に指定されている場合、 空でないバイナリ ツリー i 番目のレイヤーには最大 2^(i-1)個のノードがあります。
2. ルート ノードの層数が 1と指定されている場合 深さ h の二分木の最大ノード数は2^h-1 です。
3. 任意の二分木について 次数が 0 、葉ノードの数が n0 次数 2 の枝ノードの数 が n2 の場合
n0=n2+ 1.
4. ルート ノードの層数が 1として指定されている場合、 n個のノード を持つ完全なバイナリ ツリーの深さ h=log(n+1)
. (ps : log(n+1) は底が2 の 対数 、n+1 は対数 )。
5. n個のノード を持つ完全なバイナリ ツリーの場合 、配列の上から下、左から右の順序ですべてのノードに0から番号が付けられている場合、シリアル番号 i を持つノードの場合:
1. i>0 の場合 i位置のノードの親番号: (i-1)/2 ; i=0 iはルート ノード番号、親ノードなし
2. 2i+1<n の場合 、左の子番号: 2i+1 , 2i+1>=nそれ以外の場合、左の子はありません
3. 2i+2<n の場合 、右の子のシリアル番号: 2i+2 2i+2>=n 、それ以外の場合、右の子はありません
1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199
2.下列数据结构中,不适合采用顺序存储结构的是( )
A 非完全二叉树
B 堆
C 队列
D 栈
3.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2
4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12
5.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386
答案:
1.B
2.A
3.A
4.B
5.B

3. 二分木の格納構造

二分木の格納構造:

二分木は、一般に、逐次構造と連鎖構造の 2 つの構造を使用して格納できます。

1. 順次保管:

順次構造ストレージは、を格納するために配列 を使用することです . 一般に、配列は完全な バイナリ ツリーを表現する場合にのみ適しています .
時間の無駄。実際には配列に格納されるのはヒープのみで、ヒープについては以降の章で具体的に説明します。 二分木 順次記憶域は、物理的には配列であり、論理的には二分木です。

 チェーン収納:

二分木の連結格納構造とは、二分木を表現するために連結リストを使用すること、つまり要素の論理関係を示すためにリンクを使用することを意味します。通常の方法は
リンク リストの各ノードは、データ フィールドと左右のポインター フィールドの 3 つのフィールドで構成されます。左右のポインターは、ノードの左右の子をそれぞれ指定するために使用されます。
のリンク ポイントのストレージ アドレス。チェーン構造は二股チェーンと三股チェーンに分けられますが、現在は二股チェーンを中心に研究しています。
赤黒木などの高レベルのデータ構造を学習した後、ターナリ チェーンが使用されます。 
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
};

おすすめ

転載: blog.csdn.net/qq_66767938/article/details/129720041