ツリーの概念:ツリーは、ツリーのような構造を持つデータセットをシミュレートするために使用される抽象データタイプ(ADT)です。n> = 1の有限ノードで構成され、階層関係を持つセットを形成します。
各ノードはゼロまたは複数の子ノード;
—親ノードのないノードはルートノードと呼ばれ
ます—各非ルートノードには1つの親ノードしかありません—ルートノードを
除き、各子ノードは複数の互いに素なサブツリーに分割できます
ツリーのいくつかの用語:
(1)ノードの次数:ノードに含まれるサブツリーの数はノードの次数と呼ばれます
(2)ツリーの次数:ツリー内の最大ノードの次数
(3)リーフノード:次数ゼロノード
(4)親ノード:ノードに子ノードが含まれている場合、このノードはノードの子ノードと呼ばれます
(5)子ノード:ノードには、ノードの子ノードと呼ばれるサブツリーノードが含まれます
(6)兄弟ノード:同じ
親ノードを持つノードは兄弟ノード(7)ノードと呼ばれます。ルートノードの定義から始めて、ルートは最初のレイヤー、ルートの子は2番目のレイヤー、のようになります
(8)。高さまたは深さ:ツリー内のノードの最大レベル
(9)いとこのノード:親ノードが同じレベルにあるノードは、お互いのいとこです
(10)ノードの祖先:ルートからノードへのブランチ上のすべてのノード
(11)子孫特定のノードをルートとするサブツリー内のノードは、ノードの子孫
(12)フォレストと呼ばれます。フォレストは、n個の互いに素なツリーのコレクションで構成されます。
ツリーのタイプ:
(1)順序付けられていない
ツリー:ツリー内のノードの子ノード間に順序関係はありません。このツリーは順序付けられていないツリーと呼ばれます。(2)順序付けされたツリー:–(
1)バイナリツリー:各ノードには最大で2つのサブツリーのツリーはバイナリツリーと呼ばれます。バイナリツリーのタイプは、完全なバイナリツリー、バランスのとれたバイナリツリー、ソートされたバイナリツリー
–(2)ハフマンツリー
–(3)Bツリーです。
ツリーストレージ
(1)シーケンシャルストレージ:データ構造を固定配列に格納すると、走査速度に利点がありますが、スペースは比較的大きくなります
(2)チェーンストレージ:バイナリツリーは通常チェーンストレージを使用しますが、欠陥はポインターフィールドポインターですの数は不定です。解決策:マルチフォークツリーを処理のためにバイナリツリーに変換します。
ノードの数を把握できないため、共通ツリーのストレージ表現は処理のためにバイナリツリーに変換され、子ノードの数は最大2
いくつかの一般的なツリーアプリケーションシナリオ
1.xml、htmlなど。これらのパーサーを作成する場合、ツリー
2 を使用することは避けられません。ルーティングプロトコルはツリーアルゴリズムを使用することです
。3.mysqlデータベースインデックス4.ファイル
システムディレクトリ構造
5.多くの古典的なAIアルゴリズムは実際にはツリー検索です。さらに、機械学習の決定木もツリー構造
です。実際の生活でのツリーの使用は非常に一般的です
二分木:二分木は、ノードごとに最大2つのサブツリーを持つツリー構造です。サブツリーは通常、左および右サブツリーと呼ばれます
バイナリツリーの特性:
(1)プロパティ1:バイナリツリーのi番目のレイヤーに
は最大で2 ^(i-1)ノードがあります(2)深度kのバイナリツリーには最大で2 ^ i-1ノードがあります
(3)任意のバイナリツリー、リーフノードの数がN0で、次数2のノードの総数がN1の場合、N0 = N1 + 1
(4)nノードの完全なバイナリツリーの深さは次のようになります。log(n + 1)
二分木の種類:
完全な二分木:最後のレイヤーを除いて、各レイヤーのノード数が最大数に達し、葉ノードが左から右に配置されます
完全な二分木:葉ノードを除くすべてのノードには左と右の子葉があり、葉ノードは二分木の下部にあり、各層はノードでいっぱいです
バイナリツリーのデータ構造:Pythonの実装
节点的数据结构:数据区、左链接区、右链接区
class Node(object):
"""节点类"""
def __init__(self, elem=0, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
树的创建,创建一个树结构,添加根节点,开始为空树,然后按照广度优先(层序遍历:横向)来添加节点
【拓展: ---深度优先(纵向:通常有三种遍历方式)】
class Tree(object):
"""树类"""
def __init__(self, root=None):
self.root = root
"""通过层序遍历来添加节点"""
def add(self, elem):
"""为树添加节点"""
node = Node(elem)
#如果树是空的,则对根节点赋值
if self.root == None:
self.root = node
else:
queue = []
queue.append(self.root)
#对已有的节点进行层次遍历
while queue:
#弹出队列的第一个元素
cur = queue.pop(0)
if cur.lchild == None:
cur.lchild = node
return
elif cur.rchild == None:
cur.rchild = node
return
else:
#如果左右子树都不为空,加入队列继续判断
queue.append(cur.lchild)
queue.append(cur.rchild)