以上为按层次生成的二叉树。
关于二叉树简单的操作包括二叉树节点的定义、二叉树的生成、二叉树的前序遍历、中序遍历、后序遍历。
1.首先关于节点的定义:
"""
@ python 二叉树及其遍历
@ author: blackzero
"""
'''
1. 首先定义树节点的类型
'''
class Node(object):
# 定义初始化函数
# val 为节点的值,默认为-1
# lChild 为节点的左子树,默认为None
# rChild 为节点的右子树,默认为None
def __init__(self,val = -1,lChild = None,rChild = None):
self.val = val
self.lChild = lChild
self.rChild = rChild
2. 定义树类型的相关操作:
'''
2. 定义树的类型
'''
class Tree(object):
# 定义初始化函数
# 树为空是,其根节点为一个空节点
# 这里需要一个辅助队列,协助树的生成
def __init__(self):
self.root = Node()
self.Queue = []
# 添加子节点,也即生成树,这是一种非常简单的实现形式,按层次生成
def add(self, val):
node = Node(val)
if self.root.val == -1: # 如果当前的节点的val为-1
self.root = node # 则树的root指针指向这个新生成的节点
self.Queue.append(self.root) # Queue用来装载树的节点
else:
currentNode = self.Queue[0] # 获取Queue中的第一个元素,也就是当前需要添加左、右子树的节点
if currentNode.lChild == None:
currentNode.lChild = node
self.Queue.append(node)
else:
currentNode.rChild = node
self.Queue.append(node)
self.Queue.pop(0) # self.Queue.pop(0)的作用就是把队列Queue中的第一个元素出队列,这样后面的节点就成为要构建子树的根节点
# 前序遍历
def preorder_traversal(self,root):
# 这一句很关键,是递归停止的条件
if root == None:
return
print(root.val)
self.preorder_traversal(root.lChild)
self.preorder_traversal(root.rChild)
# 中序遍历
def inorder_traversal(self,root):
if root == None:
return
self.inorder_traversal(root.lChild)
print(root.val)
self.inorder_traversal(root.rChild)
# 后序遍历
def postorder_traversal(self, root):
if root == None:
return
self.postorder_traversal(root.lChild)
self.postorder_traversal(root.rChild)
print(root.val)
3. 验证:
if __name__ == '__main__':
tree = Tree()
for i in range(10):
tree.add(i)
tree.preorder_traversal(tree.root)
print('*'*15)
tree.inorder_traversal(tree.root)
print('*' * 15)
tree.postorder_traversal(tree.root)
本文仅用递归的方法实现前序、中序、后序遍历,还有循环、栈的方法实现,后续更新。
参考九茶大佬的博客