手搓二叉树构建类代码详解:从入门到实践(适合新手小白)

贾蔷
• 阅读 2

一、简介和应用 二叉树是数据结构中常见的一种树形结构,每个节点最多有两个子节点(左子节点和右子节点)。它广泛应用于算法设计、数据存储与搜索(如二叉搜索树)、表达式解析等领域。本文将通过手写的C++代码,讲解如何构建一个基础的二叉树类,帮助新手理解其原理与实现逻辑。通过实例代码,读者可快速掌握二叉树的创建、节点连接及遍历方法。

二、特点和注意事项

  1. 递归构建:代码采用递归方式创建节点,简洁但需注意递归边界条件(如数组索引越界)。

  2. 数组存储:节点通过数组索引关联,需确保数据数组结构符合完全二叉树特性(即节点i的左右子节点索引为2i+1和2i+2)。

  3. 内存管理:构造函数中使用new动态分配内存,需注意在程序结束时释放(但示例中未处理,实际应用需补充delete)。

  4. 代码优化提示:当前实现未考虑非完全二叉树情况,如需扩展需调整节点创建逻辑。

三、实现步骤

  1. 定义节点结构:treenode包含数据data及左右指针left/right,初始化为空。

  2. 构造二叉树:提供三种构造函数:

    binarytree(int a[], int size):通过数组创建完全二叉树,使用循环连接节点。

    binarytree(int size):创建指定大小的空节点数组(未初始化数据)。

    binarytree():默认创建10000个节点的数组(不建议使用,易浪费内存)。

  3. 递归创建节点:creat()函数通过递归生成子树,核心逻辑:

    检查终止条件(索引越界或数据为0)。

    创建当前节点并赋值。

    递归生成左子树(索引2i+1)和右子树(索引2i+2)。

  4. 打印树结构:print()递归遍历,按根-左-右顺序输出节点数据。

四、代码及注释

#include <iostream>
using namespace std;

// 1. 节点定义
struct TreeNode {
    int data = 0;       // 节点数据(默认初始化为0)
    TreeNode* left = nullptr;   // 左子节点指针
    TreeNode* right = nullptr;  // 右子节点指针
};

class BinaryTree {
private:
    TreeNode* nodes;  // 指向节点数组的指针

public:
    // 2. 构造函数(通过数组构建完全二叉树)
    // 注意:此版本无法递归(因构造函数无返回值)
    BinaryTree(int a[], int size) {
        nodes = new TreeNode[size];  // 分配节点数组
        for (int i = 0; i < size; i++) {
            nodes[i].data = a[i];  // 填充节点数据
        }
        // 连接节点(假设完全二叉树结构)
        for (int i = 0; i < size - (size + 1) / 2; i++) {  // 父节点索引范围
            // 计算左/右子节点索引(可能需检查公式是否正确)
            nodes[i].left = &nodes[i * 2 + 1];
            nodes[i].right = &nodes[i * 2 + 2];
        }
    }

    // 3. 其他构造函数(简化版本)
    BinaryTree(int size) {
        nodes = new TreeNode[size];  // 仅分配空间
    }
    BinaryTree() {
        nodes = new TreeNode[10000];  // 默认大容量(不推荐)
    }

    // 4. 递归创建节点(辅助函数)
    TreeNode* creat(int a[], int size, int nodeid) {
        // 终止条件:索引超界或数据为0
        if (nodeid >= size || a[nodeid] == 0) {
            return nullptr;
        }
        // 创建当前节点并赋值
        TreeNode* tmpnode = &nodes[nodeid];
        tmpnode->data = a[nodeid];
        // 递归构建子树
        tmpnode->left = creat(a, size, 2 * nodeid + 1);  // 左子节点索引应为2i+1
        tmpnode->right = creat(a, size, 2 * nodeid + 2);  // 右子节点索引应为2i+2
        return tmpnode;
    }

    // 5. 打印树(递归遍历)
    void print(TreeNode* node) {
        // 前序遍历输出
        if (node!= nullptr && node->data!= 0) {
            cout << node->data;   // 输出根节点
            print(node->left);    // 递归左子树
            print(node->right);   // 递归右子树
        }
    }
    void print() {  // 封装调用
        print(nodes);
    }
};

五、总结 本文通过手搓的二叉树类代码,演示了从节点定义、递归构建到遍历的全流程。新手在实践时需注意:

  1. 理解递归逻辑与边界条件,避免无限递归或索引错误。

  2. 根据实际需求选择合适的构造函数(避免默认大容量数组)。

  3. 后续可扩展功能(如插入、删除、搜索算法)。

通过动手实现基础数据结构,能加深对算法与内存管理的认知,为进阶学习打下坚实基础。

原文:二叉树

点赞
收藏
评论区
推荐文章
白茶清欢 白茶清欢
4年前
js实现二叉树、二叉查找树
树是一种数据结构,该章节讨论二叉树(二叉树的每个节点的子节点不允许超过两个),二叉树中有又分为完全二叉树和不完全二叉树.....不在本章节赘述相关概念,感兴趣可以去查阅《数据结构》。你将会获得:1.如何使用js实现二叉查找树。2.学会前、中、后序遍历。3.了解相关实现原理阅读时长5min,可选择直接调试代码特点    二叉查找树中序遍历后
似梦清欢 似梦清欢
2年前
树与二叉树
二叉树层次建树二叉树(BinaryTree)是由有限个结点组成的集合,它或者为空集合,或者仅含一个根结点,或者由一个根结点和两棵互不相交的左、右子树组成。树为空即根节点为空。二叉树的基本形态如下图:a:空的二叉树,treeNULL。b:只有空节点的二叉树,
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
Stella981 Stella981
3年前
LeetCode(98): 验证二叉搜索树
Medium!题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树。一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/\
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.
Wesley13 Wesley13
3年前
98. 验证二叉搜索树
题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。输入:5/\14 /\ 
菜园前端 菜园前端
2年前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
贾蔷 贾蔷
4星期前
力扣501题 解题思路和步骤 C++代码实现,力扣(leetcode)
问题背景及描述力扣501题要求我们找出在一个二叉搜索树(BST)中的众数。二叉搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点,且小于其右子树中的任何节点。众数是指在BST中出现次数最多的值。解题思路分析解题的关键在于理解BST的性质以
贾蔷 贾蔷
4小时前
二叉树入门指南:从零开始理解树形数据结构
一、简介和应用二叉树是一种重要的非线性数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。它在计算机科学中有广泛的应用,是许多高级数据结构的基础。‌应用场景‌:1.数据库索引(如B树、B树)2.文件系统目录结构3.表达式树(用于编译器实现)4