ディレクトリ
配列を二分木に入れる
整数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
ツリー構造に対するトラバーサル結果を確認する