python 將有序陣列轉換為二叉樹的方法

2022-10-04 17:45:09 字數 3643 閱讀 5022

題目:將[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 它可以表示下面...