目次
二分木の概念::
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. 某二叉树共有 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. 順次保管:
チェーン収納:
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; // 当前节点值域
};