python--蓝桥杯--二叉树

 1、二叉树的定义

## 二叉树的定义
## 递归定义


## 二叉树
## 二叉树的存储结构
## 一般来说,二叉树使用链表来定义
## 和普通链表的区别是,由于二叉树每个结点有两条出边,因此指针域变成两个
## 分别指向左子树和右子树的根节点地址
## 如果某个二叉树不存在,则指向NULL
##(二叉树链表)
class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

root=TreeNode(10)

2、二叉树结点的搜索、修改

class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

root=TreeNode(10)
root.left=TreeNode(1)
root.right=TreeNode(2)
root.left.left=TreeNode(1)
root.left.right=TreeNode(2)
root.right.left=TreeNode(3)
root.right.rigth=TreeNode(4)


## 二叉树结点的查找、修改
## 需要使用递归来完成查找、修改操作
def search(root,x,newdata):
    ##空树,死胡同(递归边界)
    if root==None:
        return
    ##找到数据域为x的结点,把它修改成newdata
    if root.val==x:
        root.val=newdata
    ## 往左子树搜索x(递归式)
    search(root.left,x,newdata)
    ## 往右子树搜索x(递归式)
    search(root.right,x,newdata)

search(root,2,10)

3、二叉树的插入(失败)

class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

root=TreeNode(10)
root.left=TreeNode(1)
root.right=TreeNode(2)
root.left.left=TreeNode(1)
root.left.right=TreeNode(2)
root.right.left=TreeNode(3)
##root.right.right=TreeNode(None)

## 二叉树结点的插入
## 由于二叉树的形态很多,因此在题目不说明二叉树特点时是很难给出结点插入的具体方法
## 但是又必须认识到,结点的插入位置一般取决于数据域需要在二叉树中存放的位置
## 且对给定的结点来说,它在二叉树中的插入位置只会有一个
## insert
## 一直失败,引用与不加引用区别???
def insert(root,val):
    ## 空树,说明查找失败,也即插入位置(递归边界)
    if root is None:
        root=TreeNode(val)
        return TreeNode(val)
    if val>0:
        insert(root.left,val)
    else:
        insert(root.right,val)
##    else:
##        cur=root
##        parent=None
##        while cur is not None:
##            parentNode=cur
##            if val>0:
##                cur=cur.left
##                if cur is None:
##                    parentNode.left=val
##                    return True
##            else:
##                cur=cur.right
##                if cur is None:
##                    parentNode.right=val
##                    return True
##    return False
                
print(insert(root,-2))

4、二叉树的遍历(前中后)

class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

root=TreeNode(10)
root.left=TreeNode(1)
root.right=TreeNode(2)
root.left.left=TreeNode(1)
root.left.right=TreeNode(2)
root.right.left=TreeNode(3)

## 前序遍历
def preorder(root):
    if root==None:
        return
    print(root.val,end=" ")
    preorder(root.left)
    preorder(root.right)
preorder(root)   
print()
## 中序遍历
def inorder(root):
    if root==None:
        return
    preorder(root.left)
    print(root.val,end=" ")
    preorder(root.right)
inorder(root)
print()
## 后续遍历
def postorder(root):
    if root==None:
        return
    preorder(root.left)
    preorder(root.right)
    print(root.val,end=" ")
postorder(root)
print()

5、二叉树的层序遍历

class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

root=TreeNode(10)
root.left=TreeNode(1)
root.right=TreeNode(2)
root.left.left=TreeNode(1)
root.left.right=TreeNode(2)
root.right.left=TreeNode(3)

from collections import deque
def layerorder(root):
    dq=deque()
    dq.append(root)
    while (len(dq)!=0):
        top=dq.popleft()
        print(top.val,end=" ")
        if top.left!=None:
            dq.append(top.left)
        if top.right!=None:
            dq.append(top.right)
layerorder(root)

 二叉树定义含层数

## 结点值、左右孩子、层数
class node:
    def __init__(self,val,layer,left=None,right=None):
        self.val=val
        self.layer=layer
        self.left=left
        self.right=right

6、重建二叉树

中序序列可以与先序序列、后序序列、层序序列中的任意一个来构建唯一的二叉树,而后三者两两搭配或者是三个一起上都无法构建唯一的二叉树。

PAT A1020 Tree Traversal

给出一棵二叉树的后序遍历和中序遍历,求这颗而二叉树的层序遍历序列。

输入样例 

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
## 给出一棵二叉树的后序遍历和中序遍历,求这颗而二叉树的层序遍历序列。
class TreeNode:
    def __init__(self,val=None,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right
def TreeCreate(postL,postR,inL,inR):
    if postL>postR:
        return None
    ## 新建一个新的结点,用来存放当前二叉树的根结点
    root=TreeNode()
    ## 新结点的数据域为根结点的值
    root.val=Post[postR]
    for k in range(inL,inR+1):
        if In[k]==Post[postR]:
            break
    ## 左子树的结点个数
    numleft=k-inL
    ## 右子树的结点个数
    numright=inR-k
    root.left=TreeCreate(postL,postL+numleft-1,inL,k-1)
    root.right=TreeCreate(postL+numleft,postR-1,k+1,inR)
    return root
from collections import deque
def BFS(root):
    dq=deque()
    dq.append(root)
    while (len(dq)!=0):
        top=dq.popleft()
        print(top.val,end=" ")
        if top.left!=None:
            dq.append(top.left)
        if top.right!=None:
            dq.append(top.right)

num=int(input())
Post=list(map(int,input().strip().split()))
In=list(map(int,input().strip().split()))
root=TreeCreate(0,num-1,0,num-1)
BFS(root)

7、二叉树的静态实现(静态链表)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值