【python版】算法与数据结构【树】

本文介绍了二叉树的基本概念,包括其四种遍历方法(前序、中序、后序和层次遍历),并详细讲解了如何实现二叉搜索树的插入、查找及遍历操作。通过实例演示展示了这些算法在实际应用中的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

二叉树和它的四种遍历

二叉搜索树

测试


 

二叉树和它的四种遍历

from collections import deque
class tree:
    def __init__(self,data):
        self.data=data
        self.lchild=None
        self.rchild=None
a=tree('a')
b=tree('b')
c=tree('c')
d=tree('d')
e=tree('e')
f=tree('f')
g=tree('g')
e.lchild=a
e.rchild=g
a.rchild=c
c.lchild=b
c.rchild=d
g.rchild=f
root=e
# 四种遍历:
def pre_order(root:tree):
    if root:
        print(root.data,end=', ')
        pre_order(root.lchild)
        pre_order(root.rchild)


def in_order(root:tree):
    if root:
        in_order(root.lchild)
        print(root.data, end=', ')
        in_order(root.rchild)

def post_order(root:tree):
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data, end=', ')

def level_order(root:tree):
    queue=deque()
    queue.append(root)
    while len(queue)>0:
        node:tree=queue.popleft()
        print(node.data,end=', ')
        if node.lchild:
            queue.append(node.lchild)
        if node.rchild:
            queue.append(node.rchild)


pre_order(root)
print()
in_order(root)
print()
post_order(root)
print()
level_order(root)

894323ac25984ceba38ee472241c079c.png

 

二叉搜索树

def getele()->list:
    li=[]
    ele=input()
    ele=ele.replace(" ",'')
    for i in ele:
        i=int(i)
        li.append(i)
    return li
from collections import deque
class tree:
    def __init__(self,data):
        self.data=data
        self.lchild=None
        self.rchild=None
        self.parent=None


class BST:
    def __init__(self,li):
        self.root=None
        self.k = 1
        if li:
            for val in li:
                while self.k>0:
                    self.k-=1
                    self.root=tree(val)
                self.k-=1
                while self.k<-1:
                    self.insert(self.root,val)
                    break
    #这个初始化循环写的很差,主要是通过调试发现self.root并不能通过插入直接初始化,
    # 于是写了个专门初始化根节点的循环,不过不影响复杂度,能跑出来正确答案哈哈哈哈

    def find(self,node,val):
        if not node:
            return None
        if node.data>val:
            return self.find(node.lchild,val)
        elif node.data<val:
            return self.find(node.rchild,val)
        else:
            return node

    def insert(self,node:tree,val):
        if not node:
          node=tree(val)
        elif val<node.data:
            node.lchild=self.insert(node.lchild,val)
            node.lchild.parent=node
        elif val>node.data:
            node.rchild=self.insert(node.rchild,val)
            node.rchild.parent=node
        else:# 相等
            pass
        return node

    def pre_order(self,root: tree):
        if root:
            print(root.data, end=', ')
            self.pre_order(root.lchild)
            self.pre_order(root.rchild)

    def in_order(self,root: tree):
        if root:
            self.in_order(root.lchild)
            print(root.data, end=', ')
            self.in_order(root.rchild)

    def post_order(self,root: tree):
        if root:
            self.post_order(root.lchild)
            self.post_order(root.rchild)
            print(root.data, end=', ')

    def level_order(self,root: tree):
        queue = deque()
        queue.append(root)
        while len(queue) > 0:
            node: tree = queue.popleft()
            print(node.data, end=', ')
            if node.lchild:
                queue.append(node.lchild)
            if node.rchild:
                queue.append(node.rchild)
li=getele()
Tree=BST(li)

findnode=Tree.find(Tree.root,4)
findnode.data=9
print(Tree.find(Tree.root,4))


Tree.pre_order(Tree.root)
print()
Tree.in_order(Tree.root)
print()
# 中序遍历是有序的结果哦
Tree.post_order(Tree.root)
print()
Tree.level_order(Tree.root)

测试

  • 查找功能:

c884cb43ee214bcba062e580dedc7513.png

  •  遍历功能;

5e7ea4cf8f0a4ac7b96956ac7c7f1d04.png

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coleak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值