[英]Entering in Values for an Empty Binary Tree
我正在數組實現中創建一個特定高度的空完整二叉樹,其中所有節點當前都將 None 作為其值。
我將如何輸入值列表,以便在后序遍歷中打印時,值列表將被反轉?
例子:
create_empty_bt(height=3) # total nodes = 2^h - 1
values = [7, 6, 5, 4, 3, 2, 1]
index = 0
enter_values(index, values, root)
print_tree_postorder(root, lst)
[1, 2, 3, 4, 5, 6, 7] # output
到目前為止,我的代碼將打印: [None, None, None, None, 5, 6, 7]
class Node:
def __init__(self, v):
self.value = v
self.left = None
self.right = None
def create_empty_bt(height): # create complete binary tree
nodes = [i for i in range(2 ** height - 1, 0, -1)]
for i in range(height):
start = (2 ** i) - 1
end = (2 ** (i + 1)) - 1
for j in range(start, end):
nodes[j] = Node(None)
if j == 0:
continue
if (j % 2) == 0:
parent = (j - 2) // 2 # right child node
nodes[parent].right = nodes[j]
else:
parent = (j - 1) // 2 # left child node
nodes[parent].left = nodes[j]
return nodes[0]
# Postorder = L R V, Reverse = V R L
def enter_values(index, values, root):
if root:
if root.value is None:
root.value = values[index]
enter_values(index + 1, values, root.right)
else:
enter_values(index + 1, values, root.left)
def print_tree(node, lst): # postorder
if node:
print_tree(node.left, lst)
print_tree(node.right, lst)
lst.append(node.value)
提前致謝!
你讓這比你需要的更難。 考慮高度為h
的平衡樹是具有兩個高度為h - 1
孩子的樹。 考慮到這一點,您可以簡單地創建一個值為None
的樹:
class Node:
def __init__(self, v):
self.value = v
self.left = None
self.right = None
def create_empty_bt(height):
if height == 0:
return None
n = Node(None)
n.left = create_empty_bt(height - 1)
n.right = create_empty_bt(height -1)
return n
要執行后序遍歷,您只需以正確的順序調用子項上的函數:
def po_traverse(node):
if node is None:
return
yield from po_traverse(node.left)
yield from po_traverse(node.right)
yield node.value
這將返回一個生成器,要獲取列表,只需詢問:
list(po_traverse(node))
要插入,您可以使用相同的技術,並在遞歸展開時將節點的值設置為列表的最后一個元素:
def insertList(node, l):
if node is None:
return
insertList(node.left, l)
insertList(node.right, l)
node.value = l.pop()
注意:這會消耗列表。 您可以通過復制它或重寫函數來避免這種情況,以便它在展開時返回列表的一部分——但我雖然這更清楚地顯示了結構。
使用它可以為您提供:
> t = create_empty_bt(height=3) # total nodes = 2^h - 1
> list(po_traverse(t))
[None, None, None, None, None, None, None]
> insertList(t, [7, 6, 5, 4, 3, 2, 1])
> list(po_traverse(t))
[1, 2, 3, 4, 5, 6, 7]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.