題目:將[0,1,2,3,4,5,6,7,8,9,10]儲存到二叉樹,原陣列有序,轉換為二叉排序樹。
二叉排序樹的特點:當前節點的左子樹上的所有節點都小於該節點,右子樹上的所有節點都小於該節點。
二叉排序也稱為二叉查詢樹。
我的實現思路:
取有序陣列的中間節點作為根節點,將陣列分為左右兩個部分,對左右兩個子陣列做相同的操作,遞迴的實現。
圖示:1
23**實現:
def array_to_bitree(array):
#判斷arr是否為空
if len(array)==0:
return bitnode(array[0])
mid=len(array)//2 # 有序陣列的中間程式設計客棧元素的下標
#print(mid)
#start=0 # 陣列第乙個元素的下標
#end=-1 # 陣列最後乙個元素的下標
if len(array)>0:
#將中間元素作為二叉樹的根
程式設計客棧root=bitnode(array[mid])
#如果左邊的元素個數不為零,則遞迴呼叫函式,生成左子樹
if len(array[:mid])>0:
root.left_child = arraytobitree(array[:mid])
#如果右邊的元素個數不為零,則遞迴呼叫函式,生成左子樹
if len(array[mid+1:])>0:
root.right_child = arraytobitree(array[mid+1:])
return root
我們呼叫前面寫的三種遍歷方法看一看,我們構造的樹是否正確:
#將[0,1,2,3,4,5,6,7,8,9,10]儲存到二叉樹
if __name__ == '__main__':
#先構造乙個有序陣列、鍊錶
arr=
for i in range(10):
arr.append(i)
print(arr)
#呼叫函式
bt=arraytobitree(arr)
#前序遍歷二叉樹
print("前序")
print_tree_pre_order(bt)
# 中序遍歷二叉樹
print("中序")
print_tree_mid_order(bt)
# 後序遍歷二叉樹
print("後序")
print_tree_after_order(bt)
輸出:根據這三種遍歷結果可以判斷出二叉樹的結構,結果和前面的是一樣的,**如下:
#定義二叉樹結點型別
class bitnode:
"""docstring for bitnode"""
def __init__(self,arg):
self.data = arg
self.left_child = none
self.right_child = none
#前序遍歷
def print_tree_pre_order(root):
#先判斷二叉樹是否為空
#if root.left_child is none and root.right_child is none:
if root is none:
return root
#先根print(root.data)
#再左if root.left_child is not none:
print_tree_pre_order(root.left_child)
#再右if root.right_child is not none:
print_tree_pre_order(root.right_child)
#中序遍歷二叉樹
def print_tree_mid_order(root):
#先判斷二叉樹是否為空,當左右節點都為空時
if root is none:
return
#中序遍歷 左根右
#遍歷左子樹
if root.left_child is not none:
print_tree_mid_order(root.left_child)
#遍歷根節點
print(root.data)
#遍歷右子樹
if root.right_child is not none:
print_tree_mid_order(root.right_child)
#後序遍歷
def print_tree_after_order(root):
#先判斷二叉樹是否為空
if root is none:
return root
#再左if root.left_child is not none:
print_tree_after_order(root.left_child)
#再右if root.right_child is not none:
print_tree_after_order(root.right_child)
#先根print(root.data)
def array_to_bitree(array):
#判斷arr是否為空
if len(array)==0:
return bitnode(array[0])
mid=len(array)//2 # 有序陣列的中間元素的下標
#print(mid)
#start=0 # 陣列第乙個元素的下標
#end=-1 # 陣列最後乙個元素的下標
if len(array)>0:
#將中間元素作為二叉樹的根
root=bitnode(array[mid])
#如果左邊的元素個數不為零,則遞迴呼叫函式,生成左子樹
if len(array[:mid])>0:
root.left_child = array_to_bitree(array[:mid])
#如果右邊的元素個數不為零,則遞迴呼叫函式,生成左子樹
if len(array[mid+1:])>0:
root.right_child = array_to_bitree(array[mid+1:])
return root
#將[0,1,2,3,4,5,6,7,8,9,10]儲存到二叉樹
if __name__ == '__main__':
#先構造乙個有序陣列、鍊錶
arr=
for i in range(9):
arr.append(i)
print(arr)
#呼叫函式
bt=array_to_bitree(arr)
#前序遍歷二叉樹
print("前序")
pri程式設計客棧nt_tree_pre_order(bt)
# 中序遍歷二叉樹
print("中序")
print_tree_mid_order(bt)
# 後序遍歷二叉樹
print("後序")
print_tree_after_order(bt)
本文標題: python 將有序陣列轉換為二叉樹的方法
本文位址: /jiaoben/python/255180.html
LeetCode108 將有序陣列轉換為二叉搜尋樹
將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 3 9 10...
LeetCode108 將有序陣列轉換為二叉搜尋樹
將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 3 9 10...
leetcode108 將有序陣列轉換為二叉搜尋樹
將有序陣列轉換為二叉搜尋樹。難度 簡單。將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面...