详细教程可以看这个python实现二叉树(一)_python 二叉树-优快云博客
具体代码:
class TreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
class BinTree:
def __init__(self):
self.root = None
self.ls = []
def add(self, data):
node = TreeNode(data)
if not self.root:
self.root = node
self.ls.append(self.root)
else:
rootNode = self.ls[0]
if not rootNode.left:
rootNode.left = node
self.ls.append(rootNode.left)
elif not rootNode.right:
rootNode.right = node
self.ls.append(rootNode.right)
self.ls.pop(0)
def preOrderTraversal(self, root): # 前序遍历
if not root: # 根节点为空,跳过
return
print(root.data)
self.preOrderTraversal(root.left) # 递归调用,生成左子树
self.preOrderTraversal(root.right) # 递归调用,生成右子树
def preOrderStack(self, root):
if not root:
return
stack, result, node = [], [], root
while node or stack: # 节点不空或者stack不空时循环
while node:
result.append(node.data) # 将当前节点的数据项添加到result
stack.append(node)
node = node.left # 当前节点没有左节点时退出
node = stack.pop() # 当前节点pop出stack,获取其地址值
node = node.right # 寻找当前节点的右节点
print(result)
def postOrderTraversal(self, root): # 后序遍历
if not root:
return
self.postOrderTraversal(root.left)
self.postOrderTraversal(root.right)
print(root.data)
def postOrderStack(self, root):
if not root:
return
stack, seq, result, node = [], [], [], root
while node or stack:
while node:
seq.append(node.data)
stack.append(node)
node = node.right
node = stack.pop()
node = node.left
while seq:
result.append(seq.pop())
print(result)
def inOrderTraversal(self, root): # 中序遍历
if not root:
return
self.inOrderTraversal(root)
print(root.data)
self.inOrderTraversal(root)
def inOrderStack(self, root):
if not root:
return
stack, result, node = [], [], root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
result.append(node.data)
node = node.right
print(result)
def levelOrder(self, root):
if not root:
return
queue, result, node = [], [], root
queue.append(node)
while queue:
node = queue.pop(0)
result.append(node.data)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
print(result)
if __name__ == '__main__':
tree = BinTree()
for i in range(1, 11):
tree.add(i)
tree.preOrderTraversal(tree.root)
tree.preOrderStack(tree.root)
tree.levelOrder(tree.root)