【数据结构与算法python】树的实现

方法一:树的嵌套列表实现

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())

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值