Pythonツリーとツリーアルゴリズム

ツリーの概念:ツリーは、ツリーのような構造を持つデータセットをシミュレートするために使用される抽象データタイプ(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)
129の元の記事を公開 43のような 100,000以上を訪問

おすすめ

転載: blog.csdn.net/nbxuwentao/article/details/104606165
おすすめ