二叉树的建立与遍历

二叉树是一种非线性数据结构. 二叉树 由节点构成,每个节点包含节点值和指向左节点和右节点的指针.

常用术语: 根节点(root node):位于二叉树顶层的节点,没有父节点。 叶节点(leaf node):没有子节点的节点,其两个指针均指向 None 。 边(edge):连接两个节点的线段,即节点引用(指针)。 节点所在的层(level):从顶至底递增,根节点所在层为 1 。 节点的度(degree):节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。 二叉树的高度(height):从根节点到最远叶节点所经过的边的数量。 节点的深度(depth):从根节点到该节点所经过的边的数量。 节点的高度(height):从距离该节点最远的叶节点到该节点所经过的边的数量。

二叉树的遍历 分为层序遍历,前序遍历,中序遍历,后序遍历. 层序遍历本质为BFS,即广度优先搜索. 层序遍历顾名思义,为一层层的从上往下,从左到右遍历.

前序遍历,中序遍历,后序遍历本质为DFS,即深度优先搜索. 访问时机如图: tree

代码示例:

#include<vector>
#include<queue>
#include<iostream>
struct tree{
    int value;
    tree *left;
    tree *right;
    tree(int x) : value(x), left(nullptr), right(nullptr){}
};
std::vector<int> vec;
//层序遍历
std::vector<int> levelorder(tree *root){
    std::queue<tree *> q;
    q.push(root);
    std::vector<int> vec;
    while(!q.empty()){
        tree *node = q.front();
        q.pop();
        vec.push_back(node->value);
        if(node->left != nullptr){
            q.push(node->left);
        }
        if(node->right != nullptr){
            q.push(node->right);
        }
    }
    return vec;
}
//前序遍历
void preorder(tree *root){
    if(root == nullptr){
        return;
    }
    vec.push_back(root->value);
    preorder(root->left);
    preorder(root->right);
}
//中序遍历
void inorder(tree *root){
    if(root == nullptr){
        return;
    }
    inorder(root->left);
    vec.push_back(root->value);
    inorder(root->right);
}
//后序遍历
void postorder(tree *root){
    if(root == nullptr){
        return;
    }
    postorder(root->left);
    postorder(root->right);
    vec.push_back(root->value);
}

int main(){
    tree *t0 = new tree(1);
    tree *t1 = new tree(2);
    tree *t2 = new tree(3);
    tree *t3 = new tree(4);
    tree *t4 = new tree(5);

    t0->left = t1;
    t0->right = t2;
    t1->left = t3;
    t1->right = t4;
    
    preorder(t0);
    for(auto &i : vec){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    vec.clear();

    inorder(t0);
    for(auto &i : vec){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    vec.clear();  

    postorder(t0);
    for(auto &i : vec){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    vec.clear();

    return 0;
}

使用数组表示二叉树: 用数组表示时,观察可知节点下标为 i 时, 父节点下标为 (i - 1) / 2 左节点下标为 2 * i + 1 ,右节点下标为 2 * i + 2 依此规律我们可以使用数组表示出二叉树

#include<vector>
#include<iostream>
std::vector<int> vec;

int parent(int i){
    return (i - 1) / 2;
}
int left(int i){
    return 2 * i + 1;
}
int right(int i){
    return 2 * i + 2;
}


void pretree(std::vector<int> &tree, int i){
    if(i < 0 || i >= tree.size()){
        return;
    }
    vec.push_back(tree[i]);
    pretree(tree, left(i));
    pretree(tree, right(i));
}
void intree(std::vector<int> &tree, int i){
    if(i < 0 || i >= tree.size()){
        return;
    }
    intree(tree, left(i));
    vec.push_back(tree[i]);
    intree(tree, right(i));
}
void posttree(std::vector<int> &tree, int i){
    if(i < 0 || i >= tree.size()){
        return;
    }
    posttree(tree, left(i));
    posttree(tree, right(i));
    vec.push_back(tree[i]);
}

int main(){
    std::vector<int> tree(10);
    for(int i = 0; i < 10; i++){
        std::cin >> tree[i];
    }

    pretree(tree, 0);
    for(auto &i : vec){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    vec.clear();

    intree(tree, 0);
    for(auto &i : vec){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    vec.clear();

    posttree(tree, 0);
    for(auto &i : vec){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    vec.clear();

    return 0;
}

参考文章

更新于 2024/07/03

评论

评论 0

暂无评论
全部文章
music

521755ldsdl.jpg

关于

QAQ

C++离散化

为什么要离散化处理? 数据过于多时难以表示数组下标 离散化是什么? 可以类比哈希表 离散化就像哈

教程超详细xcpc滚榜教程

首先需要导出比赛的表格 1.处理表格 最终效果如下图 自行添加的列有id,judged,solv

C++快速幂

快速幂 用于快速求a^b的算法 思想:拆分 例:求2^13 等价于求 2^1 * 2^4 * 2

C++高精度运算(加减乘除)

在程序中高精度加法和高精度减法的运算本质是模拟我们在小学就学过的运算规则,也是我们平时用的运算规

C++素数筛法(埃氏筛法、线性筛法)

素数筛法:用于筛选出素数 核心思想:用一个数筛选其余的数 普通筛法: 时间复杂度为O(nlogn

C++二叉树的建立与遍历

二叉树是一种非线性数据结构. 二叉树 由节点构成,每个节点包含节点值和指向左节点和右节点的指针.

C++链表

链表是一种逻辑结构上的线性表,物理结构上的非线性表 链表由许多节点组成,每个节点有对应的值和指向

C++C++实现顺序表

顺序表,一种线性表,因此顺序表是线性的. 因为顺序表在物理结构与逻辑结构都是连续的.意味着在内存

PythonPython基础

标识符 Python中标识符由字母,数字,下划线组成. 字母区分大小写,不能以数字开头,以下划线

算法并查集

并查集 :并为合并(合并两个节点),查为查询(查询根节点),集是一个集合. 联通块问题 //各个

K 随时打开ESC 关闭

阅读设置

设置仅保存在当前设备。

主题

背景

文章布局