node_list = [
{'data': 'A', 'left': 'B', 'right': 'C', 'is_root': True},
{'data': 'B', 'left': 'D', 'right': 'E', 'is_root': False},
{'data': 'C', 'left': None, 'right': None, 'is_root': False},
{'data': 'D', 'left': None, 'right': None, 'is_root': False},
{'data': 'E', 'left': None, 'right': None, 'is_root': False},
]
class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
#构造二叉树
class Tree:
def __init__(self, root=None):
self.root = root # 指向根节点
def init_data(self, node_list):
node_dict = {}
for item in node_list:
node = Node(item['data'], item['left'], item['right'])
node_dict[item['data']] = node
if item['is_root']:
self.root = node_dict[item['data']]
for item in node_list:
node = node_dict[item['data']]
if node.left:
node.left = node_dict[node.left]
if node.right:
node.right = node_dict[node.right]
#非递归遍历二叉树
# 栈底 [(root, 3), (root.right, 0), (root, 2), (root.left, 0), (root, 1)] 栈顶进出
# 栈底 [(root, 3), (None, 0), (root, 2), (None, 0), (root, 1)] 栈顶进出
# (node, count)
# 多递归 多套参数 元组存储多套参数 进入栈 后进先出 还原递归--回归顺序
class Solution:
def preorder_traversal(self, root):
stack = [(root,0)]
#print(stack[0][0].data)
values = []
while stack:
for i in range(len(stack)):
if stack[i][0] is None:
print("({}, {})".format(stack[i][0],stack[i][1]),end = "\t")
else:
print("({}, {})".format(stack[i][0].data,stack[i][1]),end = "\t")
print()
node, count = stack.pop()
if node is None:
print("node is None")
continue
if count == 0:
print("count == 0")
stack.append((node,3))
stack.append((node.right,0))
stack.append((node,2))
stack.append((node.left,0))
stack.append((node,1))
if count == 1:
print("count == 1")
values.append(node.data)
return values
if __name__ == "__main__":
#初始化二叉树
tree = Tree()
tree.init_data(node_list)
#前序遍历 栈 非递归
print(Solution().preorder_traversal(tree.root))
二叉树 非递归 先序遍历(根 左 右)
最新推荐文章于 2024-09-17 23:15:58 发布