Python实现二叉树的定义、前序、中序、后序、层次遍历
作者:互联网
定义二叉树类,实现二叉树的插入、查找和赋值:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
class BinaryTree:
def __init__(self, root_obj):
self.key = root_obj
self.leftChild = None
self.rightChild = None
def insert_left(self, new_node):
if self.leftChild is None:
self.leftChild = BinaryTree(new_node)
else:
temp = BinaryTree(new_node)
temp.leftChild = self.leftChild
self.leftChild = temp
def insert_right(self, new_node):
if self.rightChild is None:
self.rightChild = BinaryTree(new_node)
else:
temp = BinaryTree(new_node)
temp.rightChild = self.rightChild
self.rightChild = temp
def get_right_node(self):
return self.rightChild
def get_left_node(self):
return self.leftChild
def set_root_val(self, obj):
self.key = obj
def get_root_val(self):
return self.key
# tree = BinaryTree('root')
# print(tree.get_left_node())
# tree.insert_left('left001')
# tree.insert_right('right001')
# tree.get_left_node().insert_left('left002')
# print(tree.get_left_node().get_left_node().get_root_val())
实现二叉树的前序、中序、后序递归与非递归遍历,实现二叉树的层次遍历:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from Tree.BinaryTree import BinaryTree
tree = BinaryTree('root')
tree.insert_left('left001')
tree.insert_right('right001')
tree.get_left_node().insert_left('left-left-001')
tree.get_left_node().insert_right('left-right-001')
tree.get_right_node().insert_left('right-left-001')
tree.get_right_node().insert_right('right-right-001')
# 前序遍历(递归): 根-左-右
def pre_order_recursive(root_node):
if not root_node:
return
print(root_node.key)
pre_order_recursive(root_node.leftChild)
pre_order_recursive(root_node.rightChild)
# 前序遍历2(递归,带返回值)
def pre_order_recursive2(root_node):
res = []
def helper(root):
if not root:
return None
res.append(root.key)
helper(root.leftChild)
helper(root.rightChild)
helper(root_node)
return res
# 前序非递归遍历
def pre_order_non_recursive(root_node):
stack = [root_node]
while stack:
print(root_node.key)
if root_node.rightChild:
stack.append(root_node.rightChild)
if root_node.leftChild:
stack.append(root_node.leftChild)
root_node = stack.pop()
# 前序非递归遍历(带返回值)
def pre_order_non_recursive2(root_node):
res = []
if not root_node:
return res
stack = [root_node]
while stack:
root_node = stack.pop()
res.append(root_node.key)
if root_node.rightChild:
stack.append(root_node.rightChild)
if root_node.leftChild:
stack.append(root_node.leftChild)
return res
# 中序遍历(递归):左-根-右
def mid_order_recursive(root_node):
if not root_node:
return
mid_order_recursive(root_node.leftChild)
print(root_node.key)
mid_order_recursive(root_node.rightChild)
# 中序递归遍历,带返回值
def mid_order_recursive2(root_node):
res = []
def helper(root):
if not root:
return
helper(root.leftChild)
res.append(root.key)
helper(root.rightChild)
helper(root_node)
return res
# 中序非递归遍历
def mid_order_non_recursive(root_node):
stack = []
pos = root_node
while pos or len(stack) > 0:
if pos:
stack.append(pos)
pos = pos.leftChild
else:
pos = stack.pop()
print(pos.key)
pos = pos.rightChild
# 中序非递归遍历,带返回值
def mid_order_non_recursive2(root_node):
res = []
stack = []
pos = root_node
while pos or len(stack) > 0:
if pos:
stack.append(pos)
pos = pos.leftChild
else:
pos = stack.pop()
res.append(pos.key)
pos = pos.rightChild
return res
# 后续递归遍历:左-右-根
def post_order_recursive(root_node):
if not root_node:
return
post_order_recursive(root_node.leftChild)
post_order_recursive(root_node.rightChild)
print(root_node.key)
# 后续递归遍历,带返回值
def post_order_recursive2(root_node):
res = []
def helper(root):
if not root:
return
helper(root.leftChild)
helper(root.rightChild)
res.append(root.key)
helper(root_node)
return res
# 后序非递归遍历
# 使用两个栈结构,第一个栈类似前序遍历进栈(注意左右子节点入栈顺序和前序遍历的差别);
# 第一个栈是先放根,再放右子树,再放左子树,在入栈的同时,也把每次的根节点放入stack2 ;
# 所以第二个栈stack2的入栈顺序是:根-右子树的根-右子树叶节点(先右后左)-左子树的根-左子树叶节点(先右后左);
def post_order_non_recursive(root_node):
stack = [root_node]
stack2 = []
while len(stack) > 0:
node = stack.pop()
stack2.append(node)
if node.leftChild:
stack.append(node.leftChild)
if node.rightChild:
stack.append(node.rightChild)
while len(stack2) > 0:
print(stack2.pop().key)
# 后序非递归遍历,带返回值
def post_order_non_recursive2(root_node):
res = []
stack = [root_node]
stack2 = []
while len(stack) > 0:
node = stack.pop()
stack2.append(node)
if node.leftChild:
stack.append(node.leftChild)
if node.rightChild:
stack.append(node.rightChild)
while len(stack2) > 0:
res.append(stack2.pop().key)
return res
# 层次遍历
def layer_traverse(root_node):
if not root_node:
return None
queue = [root_node] # 因为是先进先出,所以用queue定义变量名更合适
while len(queue) > 0:
node = queue.pop(0)
print(node.key)
if node.leftChild:
queue.append(node.leftChild)
if node.rightChild:
queue.append(node.rightChild)
# 层次遍历,带返回值
def layer_traverse2(root_node):
res = []
if not root_node:
return None
queue = [root_node]
while len(queue) > 0:
node = queue.pop(0)
res.append(node.key)
if node.leftChild:
queue.append(node.leftChild)
if node.rightChild:
queue.append(node.rightChild)
return res
print(layer_traverse2(tree))
标签:node,rightChild,Python,前序,leftChild,二叉树,root,stack,def 来源: https://blog.csdn.net/whuzhang16/article/details/117754056