python 二叉树

  1. 二叉树类
class binarytree():
    def __init__(self,value=None):
        self.value=value
        self.left=None
        self.right=None
        self.parent=None
    def setright(self,a):
        self.right=a
        if a!=None:#节点为空,不设此节点的父节点
           a.parent=self
    def setleft(self,a):
        self.left=a
        if a!=None:
           a.parent=self
    def getright(self):
        return self.right
    def getleft(self):
        return self.left
    def getvalue(self):
        return self.value
    def getparent(self):
        return self.parent
    def __str__(self):
        return self.value

2 用列表建立二叉树(递归)

def creat(li):
    while len(li)>0:
        if li[0]== '#':#空节点
            li.pop(0)
            return None
        else:
            t=binarytree(li[0])#中间节点-左子树-右子树
            li.pop(0)
            t.setleft(creat(li))
            t.setright(creat(li))
            return t
    return t
root=creat([1,2,3,'#','#',4,5,'#','#','#',6,'#','#'])
           1
     2         6
  3    4     -    -
-  -  5  - 

3三种便利

def pretraverse(root):#前序遍历,中间节点-左子树-右子树
    if root:
        print(root.getvalue())
        pretraverse(root.getleft())
        pretraverse(root.getright())
def inordertraverse(root): #中序遍历,左子数-中间节点-右子树
    if root:
        inordertraverse(root.getleft())
        print(root.getvalue())
        inordertraverse(root.getright())

def lasttraverse(root): #后序遍历,左子数-右子树 -中间节点
    if root:
        lasttraverse(root.getleft())
        lasttraverse(root.getright())
        print(root.getvalue())
root=creat([1,2,3,'#','#',4,5,'#','#','#',6,'#','#']
pretraverse(root)
inordertraverse(root)
lasttraverse(root) 
#结果
 #1 2 3 4 5 6 
 #3 2 5 4 1 6 
 #3 5 4 2 6 1 

4递归搜索二叉树

def tracepath(a):#返回某元素和他的父节点以及父节点的父节点。。。
    if not a.getparent():
        return [a]
    else:
        return [a]+tracepath(a.getparent())

def dfs(root,a): #深度优先搜素
    stack=[root]#根节点放入桟内
    while len(stack)>0:
        if stack[0].getvalue()==a:
            return tracepath(stack[0])#找到,返回路径
        else:
            temp=stack.pop(0)#当前节点出栈
            if temp.getright():
                stack.insert(0,temp.getright()) #放到桟的最上面
            if temp.getleft():
                stack.insert(0,temp.getleft())#放到桟的最上面
    return False#
def bfs(root,a):  #广度优先搜素
    queue=[root]
    while len(queue)>0:
        if queue[0].getvalue()==a:
            return tracepath(queue[0])#找到,返回路径
        else:
            temp=queue.pop(0)#删除当前节点
            if temp.getleft():
                queue.append(temp.getleft())#放到队列最后面
            if temp.getright():
                queue.append(temp.getright())#放到队列最后面
    return False
root=creat([1,2,3,'#','#',4,5,'#','#','#',6,'#','#'])
b=dfs(root,3)
print([e.getvalue() for e in b])
b=bfs(root,6)
print([e.getvalue() for e in b])
#输出
#[3, 2, 1]
#[6, 1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值