前言
本文利用Python实现一个二叉树基类,为后续刷题做准备。
一、基本思路
构造一课二叉树有两张方法,第一种是借助list;第二种是实现一个类(有根节点以及左右子树属性)。
第二种方法容易理解,我这里简单介绍下list构造二叉树。如下图所示:
嗯,挺清晰的。
1.列表法构造二叉树
# -*- coding: utf-8 -*-
# ======================================================
# @Time : 2021/01/30
# @Author : lele wu
# @Email : 2541612007@qq.com
# @File : Tree.py
# @Comment: 构造一个树
# ======================================================
'''
用list构造一个树:
根节点 = list[0]
左子树 = list[1]
右子树 = list[2]
'''
# 创建二叉树实例
def BinaryTree(r):
return ['a',[],[]]
tree = BinaryTree('a')
print('建造一个根节点:',tree)
# 插入左子树/右子树的代码,并创建一棵树
def insertLeft(root,newBranch):
'''
:param root: 根节点
:param newBranch: 值
:return: root
'''
t = root.pop(1) # 弹出左子树
if len(t) == 0: # 若左子树为空
root.insert(1,[newBranch,[],[]])
else: # 若左子树不为空,但是想插入一个树,则记得将t保存
root.insert(1,[newBranch,t,[]])
return root
insertLeft(tree,'b')
insertLeft(tree,'c')
print('插完左子树:',tree)
def insertRigt(root,newBranch):
'''
:param root: 根节点
:param newBranch: 值
:return:
'''
t = root.pop(2)
if len(t) == 0:
root.insert(2,[newBranch,[],[]])
else:
root.insert(2,[newBranch,[],t])
return root
insertRigt(tree,'e')
insertRigt(tree,'f')
print('插完右子树:',tree)
# 还得在写一个访问函数:包括访问树的根节点,左右子树
def getRootVal(root):
return root[0]
def setRootVal(root,val):
root[0] = val
def getLeft(root):
return root[1]
def getRigth(root):
return root[2]
val = getRootVal(tree)
leftTree = getLeft(tree)
print('获取根节点值:',val)
print('获取左子树为:',leftTree)
2.构造类法
# -*- coding: utf-8 -*-
# ======================================================
# @Time : 2021/01/30
# @Author : lele wu
# @Email : 2541612007@qq.com
# @File : Tree2.py
# @Comment: 从类的角度定义一棵树
# ======================================================
# 编写一个二叉树类
class BinaryTree(object):
# 初始化一个二叉树
def __init__(self,rootobj):
self.key = rootobj
self.leftChild = None
self.rightChild = None
# 添加左子树
def insertLeft(self,newNode):
if self.leftChild == None: # 若原来根节点无左子树
self.leftChild = BinaryTree(newNode) # 则直接令leftChild指向新的节点
else: # 若已经有了节点
t = BinaryTree(newNode)# 创建一个新的分支
t.leftChild = self.leftChild # 令新节点也指向原来的左节点
self.leftChild = t # 令左子树指向新添加节点,原来节点下降一层
# 添加右子树
def insertRight(self,newNode):
if self.rightChild == None:
self.rightChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.rightChild = self.rightChild
self.rightChild = t
# 添加些访问根节点左右子树的方法
def getRoot(self):
return self.key
def getLeft(self):
return self.leftChild
def getRight(self):
return self.rightChild
def setRoot(self,val):
self.key = val
if __name__ == '__main__':
tree = BinaryTree('a')
root = tree.getRoot()
print('根节点元素为:',root)
tree.insertLeft('b')
tree.insertLeft('d')
tree.insertRight('c')
left = tree.getLeft().key
print('左树根节点为:',left)
总结
应该比较容易理解,若有问题,欢迎留言。