蓝桥杯丨二叉树

简介: 蓝桥杯丨二叉树

前言

本文主要介绍树形结构——二叉树的相关操作,创建二叉树、遍历二叉树等等

一、创建二叉树

二叉树有两种表示形式,一种是以列表的形式存储,所有元素的下标从1开始依次向后排列,编号为i的元素的左孩子编号为2i,右孩子编号为2i+1。

二叉树的每个结点:

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

(1)该结点的值

(2)该结点的左子树

(3)该结点的右子树

创建一个二叉树:

Input=[0]                                               (1)
tree=[]                                                 (2)                         
Input=Input+input().split()                                 
for item in Input:                                          
    t=TreeNode(item)
    tree.append(t)                                         
for i in range(1,len(tree)):                          
    if tree[i].val=='null':                             (3)
        continue      
    if 2*i<len(Input) and tree[2*i].val!='null':        (4)
        tree[i].left=tree[2*i]
    if 2*i+1<len(Input) and tree[2*i+1].val!='null':    (5)
        tree[i].right=tree[2*i+1]

(1)存储输入的值

(2)存储结点

(3)若树结点为null,跳过

(4)找到该结点的左子树

(5)找到该节点的右子树

二、遍历二叉树

遍历二叉树有三种方法:先序遍历、中序遍历、后序遍历

先序遍历

def preorder(i):
    if tree[i].val=='null':
        return
    print(tree[i].val)
    preorder(2*i)
    preorder(2*i+1)

中序遍历

def inorder(i):
    if tree[i].val=='null':
        return
    inorder(2*i)
    print(tree[i].val)
    inorder(2*i+1)

后序遍历

1. def postorder(i):
2. if tree[i].val=='null':
3. return
4.     postorder(2*i)
5.     postorder(2*i+1)
6. print(tree[i].val)

三、问题引入

1. 已知一棵有n个元素的二叉树存储在一个列表中。输出先序遍历、中序遍历和后序遍历这颗二叉树的结果

(注:列表中每个元素的下标即为它在二叉树中的编号,下标从1开始。如果按编号顺序排列的元素之间有为空的位置,则用0代替,值为0的元素位置不算入总数n中)

输入格式:第一行输入二叉树中元素的个数n,第二行按二叉树中的编号顺序输入n+x个元素,x为0的个数;每个元素之间用空格隔开

输出格式:输出共三行;第一行输出先序遍历的结果,第二行输出中序遍历的结果,第三行输出后序遍历的结果,每行的各元素之间用空格隔开

样例输入:

6

2 9 3 1 0 7 8

样例输出:

2 9 1 3 7 8

1 9 2 7 3 8

1 9 7 8 3 2

程序设计

class TreeNode():
    def __init__(self,val):
        self.val=val
        self.left=None
        self.right=None
def preorder(i):
    if i>=len(tree):
        return
    if tree[i].val==0:
        return
    print(tree[i].val,end=' ')
    preorder(2*i)
    preorder(2*i+1)
def inorder(i):
    if i>=len(tree):
        return
    if tree[i].val==0:
        return
    inorder(2*i)
    print(tree[i].val,end=' ')
    inorder(2*i+1)
def postorder(i):
    if i>=len(tree):
        return
    if tree[i].val==0:
        return
    postorder(2*i)
    postorder(2*i+1)
    print(tree[i].val,end=' ')
n=int(input())
lst=list(map(int,input().split(' ')))
tree=[]
tree.append(TreeNode(0))
for i in lst:
    t=TreeNode(i)
    tree.append(t)
for i in range(1,len(tree)):
    if tree[i].val==0:
        continue
    if 2*i<=len(lst) and tree[2*i].val!=0:
        tree[i].left=tree[2*i]
    if 2*i+1<len(lst) and tree[2*i+1].val!=0:
        tree[i].right=tree[2*i+1]
preorder(1)
print()
inorder(1)
print()
postorder(1)

程序分析

这是一个构建二叉树并进行前序、中序、后序遍历的程序。

主体部分:

首先输入节点个数n和按层序遍历的节点值列表lst,并创建一个空的节点列表tree作为树的基础。之后循环遍历lst,为每一个节点创建一个TreeNode对象,并将其添加到树的节点列表中。接着,再次循环遍历tree节点列表,为每个节点关联左右子节点。具体来说,检查2i和2i+1是否在节点列表范围内,以及它们的值是否不为0(因为我们使用0值表示空节点),如果是,则将它们赋值给当前节点的左右子节点。

之后是三个遍历函数preorder、inorder和postorder。这些函数参数是当前节点的索引,从1开始,因为根节点在节点列表中是第一个元素。如果索引超出了节点列表的范围或者当前节点的值为0,则直接返回。否则,按照前序、中序或后序遍历的顺序,分别先递归调用左子节点,然后递归调用右子节点,并打印出当前节点的值。

程序分析:

这个程序比较简单,主要考察二叉树的构建和遍历。在输入节点值时,需要按层序遍历的顺序输入,因为后面关联左右子节点时是按照2i和2i+1来实现的。在遍历过程中,需要特别注意空节点的处理,使用0值来表示空节点,遇到0值时直接返回即可。此外,需要注意节点索引从1开始。

总结

本文介绍了二叉树的创建方法以及三种遍历方法,先序遍历、中序遍历以及后序遍历

目录
相关文章
|
存储 移动开发 Python
【蓝桥杯集训·每日一题】AcWing 3555. 二叉树
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 最近公共祖先
88 0
|
算法 C语言 索引
蓝桥杯 迷宫 二叉树 真题
蓝桥杯 迷宫 二叉树 真题
104 0
蓝桥杯 迷宫 二叉树 真题
|
算法 C语言 索引
蓝桥杯 迷宫 二叉树 真题
蓝桥杯 迷宫 二叉树 真题
126 0
蓝桥杯 迷宫 二叉树 真题
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
86 1
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
110 0
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
86 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
87 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
93 0
|
7月前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
94 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
98 0