二叉树入门指南:从零开始理解树形数据结构

贾蔷
• 阅读 10

一、简介和应用 二叉树是一种重要的非线性数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。它在计算机科学中有广泛的应用,是许多高级数据结构的基础。

‌应用场景‌:

1.数据库索引(如B树、B+树) 2.文件系统目录结构 3.表达式树(用于编译器实现) 4.决策树(机器学习算法) 5.游戏AI中的决策系统 6.哈夫曼编码(数据压缩) 二叉树特别适合需要快速查找、插入和删除操作的场景,它的平均时间复杂度通常是O(log n)。

二、特点 ‌特点‌: 1.层次结构:数据以层次方式组织 2.递归性质:每个子树也是二叉树 3.灵活大小:可以动态增长或缩小 4.多种遍历方式:前序、中序、后序遍历 5.高效搜索:在平衡二叉树中搜索效率高

三、实现步骤解析 1‌.定义节点结构‌:创建包含数据、左指针和右指针的结构体 ‌2.初始化树‌:创建根节点作为树的起点 ‌3.实现基本操作‌: 4‌.实现遍历功能‌: 四、完整代码和注释

#include<iostream>
using namespACe std;

// 定义二叉树节点结构体
struct treenode{
    int data=0;            // 节点存储的数据,默认为0
    treenode* left=nullptr;  // 左子节点指针,默认为空
    treenode* right=nullptr; // 右子节点指针,默认为空

    // 默认构造函数
    treenode() {}

    // 带参数的构造函数,可以指定父节点和位置
    treenode(int d, treenode* h, bool children){
        data = d;
        if (!children)      // 如果是左子节点
            h->left = this;  // 父节点的左指针指向当前节点
        else                // 如果是右子节点
            h->right = this; // 父节点的右指针指向当前节点
    }

    // 只带数据的构造函数
    treenode(int d){
        data = d;
    }
};

// 定义二叉树类
class tree{
public:
    treenode* root; // 根节点指针

    // 构造函数,初始化根节点
    tree(){
        root = new treenode;
    }

    // 在指定父节点的指定位置添加新节点
    void add(treenode* parent, bool children, int data){
        treenode* newnode = new treenode(data, parent, children);
    }

    // 递归添加节点,自动找到合适位置
    void add(treenode* node, int data){
        if (!node->left){    // 如果左子节点为空
            node->left = new treenode(data); // 添加到左子节点
            return;
        }
        if (!node->right){   // 如果右子节点为空
            node->right = new treenode(data); // 添加到右子节点
            return;
        }
        add(node->left, data); // 递归尝试在左子树添加
    }

    // 删除指定父节点的指定子节点
    void remove(treenode* parent, bool children){
        if (!children)       // 如果是左子节点
            parent->left = nullptr;  // 置空左指针
        else                 // 如果是右子节点
            parent->right = nullptr; // 置空右指针
        // 注意:这里应该释放被删除节点的内存
    }

    // 修改指定节点的数据
    void change(treenode* node, int data){
        node->data = data;   // 直接修改数据
    }

    // 递归查找包含指定数据的节点
    treenode* find(int data, treenode* root){
        if (!root)           // 如果当前节点为空
            return nullptr;   // 返回空指针
        if (root->data == data) // 如果找到数据
            return root;      // 返回当前节点
        treenode* ret;
        ret = find(data, root->left);  // 在左子树中查找
        if (ret)             // 如果在左子树中找到
            return ret;      // 返回找到的节点
        ret = find(data, root->right); // 在右子树中查找
        if (ret)             // 如果在右子树中找到
            return ret;      // 返回找到的节点
        return nullptr;      // 没找到返回空指针
    }

    // 前序遍历(根-左-右)
    void printpre(treenode* node){
        if (!node)           // 如果节点为空
            return;          // 返回
        cout << node->data << " "; // 先访问根节点
        printpre(node->left);      // 再遍历左子树
        printpre(node->right);     // 最后遍历右子树
    }

    // 中序遍历(左-根-右)
    void printmid(treenode* node){
        if (!node)           // 如果节点为空
            return;          // 返回
        printmid(node->left);      // 先遍历左子树
        cout << node->data << " "; // 再访问根节点
        printmid(node->right);     // 最后遍历右子树
    }

    // 后序遍历(左-右-根)
    void printpost(treenode* node){
        if (!node)           // 如果节点为空
            return;          // 返回
        printpost(node->left);     // 先遍历左子树
        printpost(node->right);    // 再遍历右子树
        cout << node->data << " "; // 最后访问根节点
    }
};

五、总结 二叉树是计算机科学中最重要的数据结构之一,理解它的原理和实现对于学习更高级的数据结构和算法至关重要。本文通过一个完整的C++实现,展示了二叉树的基本操作和三种遍历方式。对于初学者来说,掌握二叉树将为学习堆、平衡二叉树、图等更复杂的数据结构奠定坚实基础。 转自:二叉树入门指南:从零开始理解树形数据结构

点赞
收藏
评论区
推荐文章
白茶清欢 白茶清欢
4年前
js实现二叉树、二叉查找树
树是一种数据结构,该章节讨论二叉树(二叉树的每个节点的子节点不允许超过两个),二叉树中有又分为完全二叉树和不完全二叉树.....不在本章节赘述相关概念,感兴趣可以去查阅《数据结构》。你将会获得:1.如何使用js实现二叉查找树。2.学会前、中、后序遍历。3.了解相关实现原理阅读时长5min,可选择直接调试代码特点    二叉查找树中序遍历后
似梦清欢 似梦清欢
2年前
树与二叉树
二叉树层次建树二叉树(BinaryTree)是由有限个结点组成的集合,它或者为空集合,或者仅含一个根结点,或者由一个根结点和两棵互不相交的左、右子树组成。树为空即根节点为空。二叉树的基本形态如下图:a:空的二叉树,treeNULL。b:只有空节点的二叉树,
zhenghaoz zhenghaoz
4年前
算法笔记:B树
B树广泛应用于各种文件系统,文件系统中,数据都是按照数据块来进行读取操作。结合二叉树的优点和文件系统的特点,于是就有了B树:btree(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/ae3caa193bc4c55f0519114b15313721.png)B树当中每个节点存储
zhenghaoz zhenghaoz
4年前
算法笔记:红黑树
红黑树,一种平衡二叉树,最为著名的应用就是CSTL中的map,是有序集合最为理想的存储方式之一。除了二叉树所具有的属性之后,红黑树中每个节点多了一个“颜色”属性,可以是红色或者是黑色。一棵红黑树应该满足一下的性质:1.每个节点是红色或者黑色的;2.根节点是黑色的;3.每个叶节点nil是黑色的(使用哨兵节点在删除调整时可以方便不少);4.如
Wesley13 Wesley13
3年前
B树与B+树的区别?
1.B树简介B树是一种多路平衡搜索树。它由二叉树变换而来的。定义如下:1.1每个节点最多有m1个关键字1.2根节点最少有1个关键字1.3非根节点至少有m/2个关键字1.4每个节点的关键字都是按照从小到大的顺序排列,每个关键字的左子树中的关键字都小于它,而右子树中所有关键字都大于它。1.5所有的叶子节点都处于同
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
Wesley13 Wesley13
3年前
PHP数据结构与算法:二叉树
一、定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。二、特性1.在二叉树的第i层上至多有2^(i1)个结点(i0)2.深度为k的二叉树至多有2^k1个结点(k0)3.对于任意一棵二叉树,如果其叶结点数为N0,而
Wesley13 Wesley13
3年前
B
BTreeBTree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongoDB的索引技术就是基于B树的数据结构,B树也可以看作是对23查找树的一种扩展。一个m阶的BTree有以下性质1.每个节点最多有m个子节点;2.每个非叶子节点(根节点除外)至少含有m/2个子节点;3.
菜园前端 菜园前端
2年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
贾蔷 贾蔷
7小时前
手搓二叉树构建类代码详解:从入门到实践(适合新手小白)
一、简介和应用二叉树是数据结构中常见的一种树形结构,每个节点最多有两个子节点(左子节点和右子节点)。它广泛应用于算法设计、数据存储与搜索(如二叉搜索树)、表达式解析等领域。本文将通过手写的C代码,讲解如何构建一个基础的二叉树类,帮助新手理解其原理与实现