前言

本文利用Python实现一个二叉树基类,为后续刷题做准备。


一、基本思路

  构造一课二叉树有两张方法,第一种是借助list;第二种是实现一个类(有根节点以及左右子树属性)。
第二种方法容易理解,我这里简单介绍下list构造二叉树。如下图所示:
python实现二叉树类_子树
  嗯,挺清晰的。

二、代码

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)
总结

  应该比较容易理解,若有问题,欢迎留言。