1.ツリー
データを保存できるだけでなく、データ間の関係を反映するようにデータ構造を選択します。現在、データの関係には主に1対1、1対多、多対多の3種類があります。前に、要素が1対1の関係にあり、要素間を通過する線形リスト(配列、リンクリスト、スタック、キュー)について説明しました。左右をつなげてデータを表現します。1対多の関係でデータを表現するために、ツリーの概念を導入しました。ツリーをマスターするための鍵は、この継続的に拡張される1対多の関係をマスターすることです。
以下に、いくつかの規則と概念を紹介します。
ノード:ツリー内の各要素はノードと呼ばれます
親ノード(親ノード):他のノード(つまり、1対多)を生成するノード。これは、図A、B、C、およびDに示すように、多くの場合、ローカルの相対関係です。ここで、AはB、C、Dです。親ノード
子ノード:他のノード(つまり、1対多で多数)によって生成されたノード。これは、図A、B、C、およびDに示すように、ローカルの相対関係でもあります。B、C、およびDはAの子ノードです。
ルートノード:ツリーの最上位ノード(親ノードなし)。これは、ツリー全体に対する絶対的な関係です。Aに示すように。
リーフノード:子ノードのないノード。これは、ツリー全体に対する絶対的な関係でもあります。写真のK、L、F、G、M、I、J
サブツリー:大きなツリーに含まれる小さなツリー。たとえば、上のツリーのB、E、F、K、およびLも、サブツリーと呼ばれるツリーを構成します。多くの場合、ツリーは複数のサブツリーで構成されます。
空のツリー:ノードのないツリー
度:ノードが所有するサブツリーの数は、ノードの度と呼ばれます。つまり、ノードに対応するブランチツリーです。接続されたノードの中で最大の次数は、ツリーの次数と呼ばれます。
レベル:ルートノードから最も遠い子ノードに渡されるノードの数。たとえば、上の図のA、B、E、Kは最も遠いパスであり、ツリーレベルは4です。
順序付きツリーと順序なしツリー:兄弟ノード間に順序があり、順序付きツリーと呼ばれます。それ以外の場合は、順序付けられていないツリーです。上の写真は注文された木です。ここでの順序は、兄弟ノード間のサイズの関係を意味するものではないことに注意してください。これは、この種のツリーが兄弟要素の順序に敏感であることを意味します。兄弟ノードが異なる順序で配置されている場合、それは異なるツリーを表します。例:12と21は異なります。2つの要素1、2がありますが、順序、つまり順序に敏感です。1+ 2と2+ 1、結果が単独で評価される場合、無秩序です。さらに、順序付けされているかどうかに関係なく、兄弟ノード用であり、親ノードと子ノードはすべて順序付けられています。
フォレスト:交差させたくない複数のツリーはフォレストと呼ばれます。上の図に示すように、ノードB、C、およびDを持つサブツリーのコレクションはフォレストです。多くの木が森を形成し、大きな木にはしばしば森が含まれています。
概要:ツリーは、1対多のデータを格納するデータ構造であり、その形状が逆さまのツリーに似ているために名前が付けられています。ツリーの最初の要素はルートノードと呼ばれ、子のない要素はリーフノードと呼ばれます。渡りたくない木の集まりを森と呼びます。森には複数の木があり、1本の木に森を含めることもできます。これらは、人々が統一のために合意した概念です。基本的には、木の種と見なすことができる1対多のポイントを習得する必要があり、すべてのフォームは彼によって発行されます。
2.バイナリツリーの定義
バイナリツリーは現在最も広く使用されているツリー構造であり、誰もありません。インタビューでは、それはしばしば強制的なテストであり、サブアイテムまたは提案を送信します!2つのフォークは、2つのスタンを意味するのではなく、1対2のデータ関係を指します。そしてそれは秩序だった木でなければなりません!下の図に示すように、それは図aに示されています。各ノードの最後には2つの角度があります(つまり、2つのブランチ)。各レイヤーには最大で1つのノードがあることがわかります。
3.完全なバイナリツリーの定義
いわゆる完全なバイナリツリーは、バイナリツリーがいっぱいであることを意味します(つまり、すべての位置に要素があります)。実際、上記を覚えておけば十分です。本当にプッシュしたい場合は、いくつかの機能を利用できます。1.リーフノードの数は ; 2。最後のレイヤーを除いて、他のノードの数は-1です。
4.完全なバイナリツリー定義
完全なバイナリツリーは、やや不完全な完全なバイナリツリーです。完全なバイナリツリーが完全である場合、それは完全、完全、7などです。完全なバイナリツリーの最後のレベルのノードを埋める必要がないことがわかります。完全なバイナリツリーは、特別な種類の完全なバイナリツリーと考えることができます。
前のセクションで説明したデータ構造ヒープは、完全なバイナリツリーです。そのノード計算ロジックについてもう一度説明します。0から始まる添え字を定義し、親ノードの添え字はiです。次に、左側の子ノードの添え字はで、右側の子ノードの添え字はです。子ノードの添え字がiであるとすると、親ノードの添え字はです。
5.バイナリツリーの基本構造のPython実装
バイナリツリーを実装するには、シーケンシャル構造(固定サイズのメモリスペース)とチェーン構造の2つの方法があります。この記事では、pythonのリストを使用して、単純なバイナリツリーを実装します。基本的な考え方:1。3つの属性val(ノードの値)、left(左の子ノード)、right(右の子ノード)を含むノードクラスを作成します。2。すべてのノードをリストに追加します。3。リストをトラバースして検索します。各要素の左右のノードと値を割り当てます。
class Node:
def __init__(self,value,left=None,right=None):
self.val = value
self.left = left
self.right = right
def show(self):
print(self.val,end='\t')
6.バイナリツリーの事前注文トラバーサル
プレオーダートラバーサルは、左から右への深度優先トラバーサルアルゴリズムです。トラバーサルの順序は、ルートノード->左サブツリー->右サブツリーです。ルートノードが最初にトラバースされるため(個人的な理解)、プレオーダートラバーサルと呼ばれます。これを実現するために2つの方法を使用します。最初の再帰的方法は、比較的簡単に理解できます。左側の子ノードの場合は、現在のノードを出力し、その子ノードを使い果たし続けます。次に、適切な子ノードを使い果たします。2番目の方法は、スタックを使用することです。最初に右側の子ノードをスタックにプッシュし、次に左側の子ノードをスタックにプッシュし、左側の子ノードをポップし、左側の子ノードがなくなるまでトラバースを続けてから、右側の子ノードをポップします。
# 前序遍历 递归实现
# 根节点——>左子节点——>右子节点
def pre_order_recursion(self,Node):
Node.show()
if Node.left:
self.pre_order_recursion(Node.left)
if Node.right:
self.pre_order_recursion(Node.right)
# 前序遍历 使用栈来实现
def pre_order(Node):
result = []
stack = [Node]
while stack:
node = stack.pop()
if node:
result.append(node.val)
stack.append(node.right)
stack.append(node.left)
return result
7.バイナリツリーの順序どおりのトラバース
中次トラバーサルも深度優先アルゴリズムであり、その順序は左サブツリー->ルートノード->右サブツリーです。フォローノードは中央に出力されるため、中次トラバーサル(個人的な理解)と呼ばれます。 。特定のコード実装では、次のように、事前注文トラバーサルをわずかに変更するだけで済みます。
def mid_order_recursion(Node):
if Node.left:
mid_order_recursion(Node.left)
Node.show()
if Node.right:
mid_order_recursion(Node.right)
8.バイナリツリーの注文後のトラバーサル
ポストオーダートラバーサルも深度優先アルゴリズムです。そのオーダーは、左サブツリー->右サブツリー->ルートノードです。ルートノードは最後の出力であるため、ポストオーダートラバーサル(個人的な理解)と呼ばれます。具体的なコードは次のとおりです。上記を少し変更してください。
def post_order_recursion(Node):
if Node.left:
post_order_recursion(Node.left)
if Node.right:
post_order_recursion(Node.right)
Node.show()
8.バイナリツリーのレベルトラバーサル
レベルトラバーサルは、幅優先のアルゴリズムです。つまり、ルートノードから上から下に開始し、各レイヤーを左から右にトラバースします。アイデアは、現在のレイヤーノードを上から下にリストに追加してから、その左右の子ノードをリストに追加し、継続的にループすることです。
def lever_order_recursion(Node):
result = []
current_node = [Node]
while len(current_node) > 0:
next_node = []
for node_c in current_node:
result.append(node_c.val)
if node_c.left is not None:
next_node.append(node_c.left)
if node_c.right is not None:
next_node.append(node_c.right)
current_node = next_node
return result
総括する:
この記事では、最初に1対多のデータ関係を表すデータ構造であるツリーの概念について説明しました。そこから、最大2つの子ノードを持つ順序付きツリーを紹介しました。次に、完全なバイナリツリーと完全なバイナリツリーの2つの特別なバイナリツリーが導入されます。完全なバイナリツリーも、特別な種類の完全なバイナリツリーです。最後に、バイナリツリーの構築と、一般的に使用される4つのトラバーサル方法を紹介します。プレオーダートラバーサル(最初にルートノードをトラバースし、次に左サブツリーをトラバースし、最後に右サブツリーをトラバースします)、ミドルオーダートラバーサル(最初に左サブツリーをトラバースし、次にルートノードをトラバースします) 、最後に右のサブツリーをトラバースします)、その後のトラバース(最初に左のサブツリーをトラバースし、次に右のサブツリーをトラバースし、最後にルートノードをトラバースします)、これら3つのアルゴリズムは深度優先アルゴリズムです。最後に、レベルトラバーサルを導入しました。これは、データを上から下、左から右の順にトラバースする幅優先のアルゴリズムです。この記事のコードは、pythonを使用して実装されています。
ティートーク:
私のアイドルの詩をみんなにお勧めします。千年以上もの間中国の人々に触れてきた言葉、非常にわかりやすい言葉ですが、しばしば人々は涙を流します。
生と死の10年は無限であり、考えずに忘れられません。何千マイルもの孤独な墓、どこにも暗いとは言えません。彼らが出会ったとしても、彼らはそれを知らないはずです、ほこりっぽい顔、霜のような寺院。
夜、You Mengは突然家に帰り、Xiaoxuanの窓が着替えていました。涙しかありません。毎年壊れると予想される、明るい月の夜、短い松岡。
SuShiによる「JiangChengzi・YimaoFirst Moon TwentiethNightDream」