当前位置: 首页 > news >正文

算法基础——二叉树

一、⼆叉树的概念

1. 二叉树的定义 

注意:⼆叉树结点的两个孩⼦,⼀个被称为左孩⼦,⼀个被称为右孩⼦。其顺序是固定的,就像⼈ 的左⼿和右⼿,不能颠倒混淆。

2. 特殊的⼆叉树

(1)满⼆叉树

(2)完全⼆叉树

        对⼀棵树有 个结点的⼆叉树按层序编号,所有的结点的编号从 样深度的满⼆叉树的编号为从 1 ∼n 1 ∼n 。如果这棵树所有结点和同 比特就业课 的结点位置相同,则这棵⼆叉树为完全⼆叉树。 

注意:要从后往前依次删除!!! 

二、⼆叉树的存储

1. 顺序存储 

2. 链式存储

案例:

描述: 有⼀个 n(n 10^6 ) 个结点的⼆叉树。给出每个结点的两个⼦结点编号(均超过n ),建⽴⼀⼆叉树(根编号1 ),结点, 0 0

输⼊描述:

第⼀⾏⼀个整数 n 表⽰结点

n⾏, ⾏两个整数 r 分别表⽰结点 的左右结点编号。若 l = 则表⽰⽆左⼦结点, r = 0 同理。

代码实现:

#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int n;
int l[N], r[N];

int main()
{   
    cin >> n;
    // 存二叉树
    for(int i = 1; i <= n; i++)
    {
        cin >> l[i] >> r[i];
    }


    return 0;
}

三、 ⼆叉树的遍历

1. 深度优先遍历 

案例:

描述:

⼀个 n(n 10^6 ) 个结点的⼆叉树。给出每个结点的两个⼦结点编号(均超过 n ),建⽴⼀⼆叉树(根编号为1 ),结点, 0 0

描述:

第⼀⾏⼀个整数 n 表⽰结点之后 ⾏, ⾏两个整数 r 分别表⽰结点 的左右结点编号。若 l = 0m则表⽰⽆左⼦结点, r = 同理。

测试⼀:
 4
 0 2
 3 4
 0 0
 0 0
测试⼆:
 2
 2 0
 0 0
测试三:
 3
 2 3
 0 0
 0 0
测试四:
 7
 2 3
 0 4
 5 6
 0 0
 0 0
 7 0
 0 0

代码实现:

#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int n;
int l[N], r[N]; // 存树

// 先序遍历
void dfs1(int u)
{
    cout << u << " ";
    if(l[u]) dfs1(l[u]);
    if(r[u]) dfs1(r[u]);
}

// 中序遍历
void dfs2(int u)
{
    if(l[u]) dfs2(l[u]);
    cout << u << " ";
    if(r[u]) dfs2(r[u]);
}

// 后序遍历
void dfs3(int u)
{
    if(l[u]) dfs3(l[u]);
    if(r[u]) dfs3(r[u]);
    cout << u << " ";
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> l[i] >> r[i];
    }

    dfs1(1); // 先序遍历
    cout << endl;

    dfs2(1); // 中序遍历
    cout << endl;

    dfs3(1); // 后序遍历
    cout << endl;

    return 0;
}

2. 宽度优先遍历

        这个就和常规的树的遍历⽅式⼀样,直接⽤队列帮助层序遍历即可。

#include <iostream>
#include <queue>

using namespace std;

const int N = 1e6 + 10;

int n;
int l[N], r[N];

void bfs()
{
    queue<int> q;
    q.push(1);

    while(q.size())
    {
        int u = q.front(); q.pop();
        cout << u << " ";

        if(l[u]) q.push(l[u]);
        if(r[u]) q.push(r[u]);
    }
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> l[i] >> r[i];
    }

    bfs();


    return 0;
}
http://www.dtcms.com/a/98181.html

相关文章:

  • Java 程序员面试题:从基础到高阶的深度解析
  • Elasticsearch 完全指南
  • 【HarmonyOS 5】初学者如何高效的学习鸿蒙?
  • Bitnode和Bitree有什么区别 为什么Bitree前多了*
  • 缴纳过路费--并查集+优先队列
  • Qt进阶开发:Graphics View图形视图框架
  • QT 跨平台发布指南
  • 枚举算法-day2
  • python 列表-元组-集合-字典
  • 软件工程之软件开发模型(瀑布、迭代、敏捷、DevOps)
  • 综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey
  • 深度学习处理时间序列(6)
  • 自学-python-基础-注释、数据类型、运算符、判断、循环
  • 树莓派超全系列文档--(13)如何使用raspi-config工具其二
  • 中断管理常用API详解(三)
  • flatMap 介绍及作用
  • C#连接sqlite数据库实现增删改查
  • 大模型最新面试题系列:微调篇之微调框架(二)
  • AI赋能python数据处理、分析与预测操作流程
  • Vue背景介绍+声明式渲染+数据响应式
  • 基于Baklib的云内容中台落地实践
  • JMeter运行日志详细分析
  • Kafka Stream从入门到精通:构建高吞吐、低延迟的实时流处理应用
  • 力扣.旋转矩阵Ⅱ
  • sqli-labs靶场 less6
  • Android 串口配置
  • 双磁条线跟踪控制
  • LJF-Framework 第12章 LjfFilter拦截器设计
  • hbuilderx打包iOS上传苹果商店的最简流程
  • AI坦克智能决策:MOE模型的动态专家协作与加权融合