C++二叉树结构的建立与基本操作

yizhihongxing

C++二叉树是一种非常常见的数据结构,同时也是算法中经常使用的一种数据结构。本文将详细讲解C++二叉树的建立和基本操作,包括二叉树的定义、创建、遍历和删除等。

1. 二叉树的定义

二叉树是一种树形结构,每个节点最多只有两个子节点:左子节点和右子节点。树的深度取决于有多少个节点,根节点是最顶端的节点,不再有父节点。节点之间存在一些有天然排序关系且有先后性的关系,因此二叉树通常用于查找、排序等算法中。

二叉树的节点可以用一个结构体来定义,结构体中包含了一个指向左子节点和右子节点的指针,以及一个数据域,如下所示:

struct TreeNode{
    int data;                // 数据域
    TreeNode* left;          // 左子节点指针
    TreeNode* right;         // 右子节点指针
    TreeNode(int val)        // 构造函数
    : data(val), left(nullptr), right(nullptr){}
};

2. 二叉树的创建

二叉树的创建可以采用递归的方式,先创建根节点,再创建左右子树。具体实现如下:

TreeNode* CreateBinaryTree(){
    int val;
    cout << "输入节点的值(-1代表空节点):";
    cin >> val;
    if(val == -1){
        return nullptr;     // 空节点
    }
    TreeNode* node = new TreeNode(val);     // 创建新节点
    node->left = CreateBinaryTree();        // 创建左子树
    node->right = CreateBinaryTree();       // 创建右子树
    return node;
}

3. 二叉树的遍历

二叉树的遍历主要有三种方式:前序遍历、中序遍历和后序遍历。

前序遍历

前序遍历的思路是先遍历节点本身,再遍历左子树,最后遍历右子树。具体实现如下:

void preorderTraversal(TreeNode* root){
    if(root == nullptr){
        return;         // 空树,直接返回
    }
    cout << root->data << " ";         // 遍历根节点
    preorderTraversal(root->left);     // 遍历左子树
    preorderTraversal(root->right);    // 遍历右子树
}

中序遍历

中序遍历的思路是先遍历左子树,再遍历节点本身,最后遍历右子树。具体实现如下:

void inorderTraversal(TreeNode* root){
    if(root == nullptr){
        return;         // 空树,直接返回
    }
    inorderTraversal(root->left);      // 遍历左子树
    cout << root->data << " ";         // 遍历根节点
    inorderTraversal(root->right);     // 遍历右子树
}

后序遍历

后序遍历的思路是先遍历左子树,再遍历右子树,最后遍历节点本身。具体实现如下:

void postorderTraversal(TreeNode* root){
    if(root == nullptr){
        return;         // 空树,直接返回
    }
    postorderTraversal(root->left);    // 遍历左子树
    postorderTraversal(root->right);   // 遍历右子树
    cout << root->data << " ";         // 遍历根节点
}

4. 二叉树的删除

二叉树的删除主要有三种情况:

  • 被删除节点没有子节点,直接删除
  • 被删除节点只有一个子节点,将其子节点代替该节点
  • 被删除节点有两个子节点,将右子树中的最小值替换到该节点

具体实现代码如下:

TreeNode* deleteNode(TreeNode* root, int target){
    if(root == nullptr){
        return nullptr;     // 空树,直接返回
    }
    if(root->data == target){   // 找到了要删除的节点
        if(root->left == nullptr && root->right == nullptr){   // 情况一:被删除节点没有子节点
            delete root;
            return nullptr;
        }
        if(root->left == nullptr){    // 情况二:被删除节点只有一个右子节点
            TreeNode* tmp = root->right;
            delete root;
            return tmp;
        }
        if(root->right == nullptr){   // 情况二:被删除节点只有一个左子节点
            TreeNode* tmp = root->left;
            delete root;
            return tmp;
        }
        // 情况三:被删除节点有两个子节点
        TreeNode* minNode = root->right;   // 找到右子树中最小的节点
        while(minNode->left != nullptr){
            minNode = minNode->left;
        }
        root->data = minNode->data;        // 将最小值替换到被删除节点
        root->right = deleteNode(root->right, minNode->data);    // 删除右子树中的最小值
    }else if(root->data > target){
        root->left = deleteNode(root->left, target);    // 左子树中删除
    }else{
        root->right = deleteNode(root->right, target);  // 右子树中删除
    }
    return root;
}

5. 示例说明

示例1

输入数据:1 2 4 -1 -1 -1 3 -1 5 -1 -1

其中-1代表空节点,这个输入数据代表的二叉树如下所示:

graph LR
1((1)) --> 2((2))
1 --> 3((3))
2 --> 4((4))
3 --> 5((5))

输出数据:

前序遍历结果为:1 2 4 3 5

中序遍历结果为:4 2 1 3 5

后序遍历结果为:4 2 5 3 1

示例2

输入数据:5 3 2 -1 -1 4 -1 -1 7 6 -1 -1 8 -1 -1

其中-1代表空节点,这个输入数据代表的二叉树如下所示:

graph LR
5((5)) --> 3((3))
5 --> 7((7))
3 --> 2((2))
3 --> 4((4))
7 --> 6((6))
7 --> 8((8))

输出数据:

前序遍历结果为:5 3 2 4 7 6 8

中序遍历结果为:2 3 4 5 6 7 8

后序遍历结果为:2 4 3 6 8 7 5

以上就是C++二叉树的建立与基本操作的完整攻略。如果还有疑问,请留言询问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++二叉树结构的建立与基本操作 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之顺序表篇

    Java数据结构之顺序表篇 什么是顺序表 顺序表是由一组地址连续、大小相等的存储单元依次存储数据元素的线性表。 顺序表的表示 Java语言中,可以使用数组来表示顺序表。 public class SeqList<T> { private Object[] element;// 定义数组存储数据元素 private int length;// 当前…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的两种搜索算法详解

    Java数据结构之图的两种搜索算法详解 引言 图是现实世界中最为普遍的现象之一,因此对于图的分析和操作是计算机科学和工程中最为重要的问题之一。在本文中,我们将对图结构的两种搜索算法进行详细讨论和研究,这些算法是图论研究的基本工具。 图的定义 在计算机科学和数学领域中,图是由若干个节点(或称为顶点)和它们之间的边组成的一种数据结构。 图的两种搜索算法 图的搜索…

    数据结构 2023年5月17日
    00
  • Halcon学习教程(一) 之提取十字线中心 图像分割

      原文作者:aircraft   原文链接:https://www.cnblogs.com/DOMLX/p/17266405.html      废话不多说,因为毕业后工作原因比较忙,好久没更新博客了,直接上图。。。     上图有个十字线,我们要提取出十字线的中心(Hhhh这个线是我随手画的 没画直!!) 第一步:肯定是读取图像进行灰度提取处理啦。   …

    算法与数据结构 2023年4月18日
    00
  • 一步步带你学习设计MySQL索引数据结构

    一步步带你学习设计MySQL索引数据结构 索引原理 在MySQL中,索引是一种数据结构,用于快速查找表中的记录。在一张表中,可以使用不同的列来创建索引,索引可以大大提高查询效率,减少扫描行数,加快数据查询速度。 索引的实现一般使用的是B树和B+树这两种数据结构,因为它们都具有良好的平衡性,可以快速查找,插入和删除。 如何设计MySQL索引 确认需要优化的查询…

    数据结构 2023年5月17日
    00
  • Redis底层数据结构详解

    Redis底层数据结构详解 前言 Redis是一款开源的,高性能的,基于内存的数据结构存储系统。Redis支持多种数据结构,包括简单的键值对、列表、集合、有序集合等等。本篇文章将深入分析Redis的底层数据结构,介绍它们的原理、优缺点和适用场景。 1. 哈希表(Hash Table) 哈希表是Redis中最常用的底层数据结构之一。可以通过以下命令在Redis…

    数据结构 2023年5月17日
    00
  • 一行python实现树形结构的方法

    想要一行Python实现树形结构,我们需要使用Python的字典数据类型来完成任务。下面是详细的操作步骤: 创建树形结构字典 我们可以用嵌套字典来表示树形结构,我们需要选择其中一个节点作为根节点,并以键值对的形式保存其子节点。最终,我们将根节点作为整个字典的返回值。下面是实现代码: tree = lambda: defaultdict(tree) 插入节点 …

    数据结构 2023年5月17日
    00
  • Java数据结构之最小堆和最大堆的原理及实现详解

    Java数据结构之最小堆和最大堆的原理及实现详解 什么是堆? 堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一个完全二叉树,即除了最后一层,其他层都必须填满,最后一层从左到右填满 堆中每个节点的值必须满足某种特定的条件,例如最小堆要求每个节点的值都小于等于其子节点的值。 堆一般分为两种类型:最小堆和最大堆。 最小堆:每个节点的值都小于等于其子节点的值…

    数据结构 2023年5月17日
    00
  • C语言植物大战数据结构二叉树递归

    C语言植物大战数据结构二叉树递归攻略 什么是二叉树? 二叉树是一种树形结构,每个节点最多只能有两个子节点。这两个子节点被称为左子树和右子树。二叉树具有自己的结构,因此它们也适合表示具有层次结构的数据。 什么是递归? 递归是一种算法的编写技巧,通过自己来定义自己的方法,以达到解决问题的目的。递归算法把复杂的问题简单化,但是也存在着可能导致程序无限递归的风险。 …

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部