[リトルホワイトシリーズ] Pythonは論理ツリーと走査ツリー(深さ優先と幅優先)を実装し、コンピューター以外のメジャーの観点から学習します

配列を二分木に入れる

整数arrの順序付けされた配列が与えられた場合、以下が必要です。

  • 配列が順序付けられた配列である場合、順序付けられたバイナリツリーを構築する必要があります
  • インオーダートラバーサルを使用してバイナリツリーを印刷する
  • シーケンストラバーサルを使用してバイナリツリーを印刷する

1.指定された配列は順序付けられた配列であり、順序付けられたバイナリツリーを構築する必要があります

1.1ツリー

  • 重要なデータ構造をツリー化する
  • 基本的な概念:ノード、ノード関係、ノードレベル、ツリーの深さ

  • ノード:ツリー構造の基礎はツリーの基本単位です
  • ノード関係:AはBおよびCの親ノードであり、BおよびCはAの子ノードです
  • ノードレベル:ルート定義から開始して、ルートは最初のレベル、ルートの子は2番目のレベル、以下同様
  • ツリーの深さ:ツリー内のノードのレイヤーの最大数は、ツリーの深さまたは高さと呼ばれます

1.2二分木

[外部チェーン画像の転送に失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-5zwHlxHx-1586513283395)(添付ファイル:binary_tree.jpg)]

  • 各ノードには最大2つのサブツリーがあります
  • 左と右のサブツリーは順序が正しく、順序を任意に逆にすることはできません
  • ツリーのノードにサブツリーが1つしかない場合でも、それが左サブツリーか右サブツリーかを区別する必要があります。

1.3配列を二分木に入れる

  • 配列の中央の要素をルートノードとして、配列を2つの部分に分割します。
  • 配列の左と右の部分の左と右のサブツリーを再帰的に構築します
  • 再帰的アルゴリズム
class BiNode:
    def __init__(self):
        self.data = None   #结点数据
        self.lchild = None #左子树结点
        self.rchild = None #右子树结点
#将有序数组转换为二叉树
def array_to_tree(arr, start, end):
    """将有序数组转换成二叉树
        arr:有序数组
        start:数组起点索引
        end:数组结尾索引
        """
    root = None  #初始化根结点数据
    if end >= start:
        root = BiNode() #创建树实例
        mid = (start + end + 1)//2  #取中点数据索引
        root.data = arr[mid] #树的根结点诶数组中间元素
        root.lchild = array_to_tree(arr, start, mid - 1)  #使用递归方式用左半部分数组构建root的左子树
        root.rchild = array_to_tree(arr, mid+1, end) #使用递归方式用右半部分数组构建root的右子树
    else:
        root = None
    return root

グラフィカルな結果

ここに画像の説明を挿入

1.4順序トラバーサルを使用してバイナリツリーを印刷する

  • 中位トラバーサル:左サブツリー->ルートノード->右サブツリーの順にアクセス(深さ優先トラバーサル)

ここに画像の説明を挿入

#使用中序遍历的方式打印二叉树
def print_tree_midorder(root):
    """使用中序遍历的方式打印二叉树内容
        root:二叉树根结点
    """
    if root == None: #判断是否为空
        return
        
    #使用递归方式,遍历root节点的左子树
    if root.lchild != None:
        print_tree_midorder(root.lchild)
            
    #遍历root节点
    print(root.data, end = ' ')
        
    #使用递归方式,遍历root节点右子树
    if root.rchild != None:
        print_tree_midorder(root.rchild)
arr = list(range(1,11))
arr
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
root = array_to_tree(arr, 0, len(arr)-1)
print('树的中序遍历结果为:', end = '')
print_tree_midorder(root)
树的中序遍历结果为:1 2 3 4 5 6 7 8 9 10 

ツリー構造に対するトラバーサル結果を確認する

ここに画像の説明を挿入

1.5シーケンストラバーサルを使用してバイナリツリーを印刷する

  • シーケンストラバーサル:小から大へのレイヤーに従って、同じレイヤーが左から右へトラバースされます(幅の最初のトラバーサル)。
  • ノードのトラバース中に子ノードの情報を記録し、このレコードの順序でノードデータにアクセスします
  • キューを使用して、現在通過しているノードの子ノードを格納できます
#使用层序遍历的方式打印二叉树
from collections import deque  #载入队列结构,deque是双向队列
def print_tree_layer(root):
    """使用层序遍历的方式打印二叉树内容
        root:二叉树根结点
    """
    if root == None:
        return
        
    queue = deque() #创建队列实例
    #树根结点进队列
    queue.append(root)
        
    while len(queue)>0:
        p = queue.popleft() #出队
        #访问当前节点
        print(p.data, end = ' ')
            
        #如果该节点左孩子不为空,则入队列
        if p.lchild != None:
            queue.append(p.lchild)
                
        #如果该节点右孩子不为空,则入队列
        if p.rchild != None:
            queue.append(p.rchild)
arr = list(range(1,11))
arr
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
root = array_to_tree(arr, 0, len(arr)-1)
print('树的层序遍历结果为:', end = '')
print_tree_layer(root)
树的层序遍历结果为:6 3 9 2 5 8 10 1 4 7 

ツリー構造に対するトラバーサル結果を確認する


詳細については、
リンク1をご覧ください
リンク2

公開された42の元の記事 賞賛された28 訪問4961

おすすめ

転載: blog.csdn.net/KaelCui/article/details/105439112