方法一:树的嵌套列表实现
1、定义
借助Python List来实现二叉树树数据结构,采用递归的嵌套列表实现二叉树, 由具有3个元素的列表实现:
[root,left,right]
第1个元素为根节点的值;
第2个元素是左子树(所以也是一个列表);
第3个元素是右子树(所以也是一个列表)。
以下图为例,一个6节点的二叉树
根是myTree[0],左子树myTree[1],右子树myTree[2]
该树的嵌套列表表示方式如下:
tree = ['a',
['b',
['d',[],[]],
['e',[],[]]],
['c',
['f',[],[]],
[]]
]
2、特点
子树的结构与树相同,是一种递归数据结构,很容易扩展到多叉树,仅需要增加列表元素即可.
3、代码实现
# 创建仅有根节点的二叉树
def BinaryTree(r):
return [r, [], []]
# 将新节点插入树中作为其直接的左子节点
def insertLeft(root,newBranch):
t = root.pop(1)
if len(t) > 1:
root.insert(1,[newBranch,t,[]])
else:
root.insert(1,[newBranch, [], []])
return root
# 将新节点插入树中作为其直接的右子节点
def insertRight(root,newBranch):
t = root.pop(2)
if len(t) > 1:
root.insert(2,[newBranch,[],t])
else:
root.insert(2,[newBranch,[],[]])
return root
# 判断是否为叶节点
def isleaf(root):
return len(getLeftChild(root))==0 and len(getRightChild(root))==0
# 取得并返回根节点的值
def getRootVal(root):
return root[0]
# 设置根节点的值
def setRootVal(root,newVal):
root[0] = newVal
# 返回左子树
def getLeftChild(root):
return root[1]
# 返回右子树
def getRightChild(root):
return root[2]
r = BinaryTree(3)
insertLeft(r,4)
insertLeft(r,5)
insertRight(r,6)
insertRight(r,7)
l = getLeftChild(r)
print(l)
setRootVal(l,9)
print(r)
insertLeft(l,11)
print(r)
print(getRightChild(getRightChild(r)))
方法二:树的链表实现
1、定义
每个节点保存根节点的数据项,以及指向左右子树的链接。
2、代码实现
# 成员key保存根节点数据项
# 成员left/rightChild则保存指向左/右子树的引用(同样是BinaryTree对象)
class BinaryTree:
# 创建仅有根节点的二叉树
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)
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 isLeaf(self):
return ((not self.leftChild) and (not self.rightChild))
# 返回右子树
def getRightChild(self):
return self.rightChild
# 返回左子树
def getLeftChild(self):
return self.leftChild
# 设置根节点的值
def setRootVal(self,obj):
self.key = obj
# 取得并返回根节点的值
def getRootVal(self):
return self.key
# 树的高度
def height(self):
if self == None:
return -1
else:
return 1 + max(height(self.leftChild), height(self.rightChild))
r = BinaryTree('a')
print(r.getRootVal())
print(r.getLeftChild())
r.insertLeft('b')
print(r.getLeftChild())
print(r.getLeftChild().getRootVal())
r.insertRight('c')
print(r.getRightChild())
print(r.getRightChild().getRootVal())
r.getRightChild().setRootVal('hello')
print(r.getRightChild().getRootVal())