首页 > 编程语言 >C++数据结构-二叉树的存储方法(基础篇)

C++数据结构-二叉树的存储方法(基础篇)

时间:2024-09-16 09:51:23浏览次数:8  
标签:node Node 结点 NULL temp C++ right 二叉树 数据结构

1. 简介

根据前文的介绍,我们知道了二叉树的性值,其就是一种每一个结点中只允许拥有左右孩子(或为空)的树,这种数据结构在我们的实际设计中非常常用,如前文提到的STL中的set集合,其底层就是一颗标准的红黑树(二叉树的一种),我们这里以创建一颗二叉树并实现通过特定的插入顺序和读取顺序达成读取为顺序为例子进行简介。

2. 结点设计

一颗二叉树的结点设计一定要有如下内容:

a)结点元素,data域,用来存储数据,其可以是int,char等基本的类型,同时也可以是struct等这些复杂的复合数据类型。

b)左孩子结点,left指针,总是用来指向当前结点的下一层的左边结点,其属于一种指针。

c)右孩子结点,right指针,总是用来指向当前结点的下一层的右边结点,其属于一种指针。

d)父结点(可选),parent指针,总是指向当前结点的前一个结点,简称父亲结点,其不属于必须结点设计,省略掉可以打扰节省内存的效果,而使用则可以更方便进行定向搜索,本案例中不使用父节点。

以上就是一颗二叉树的结点设计,除此之外,我们使用一棵树的时候需要建立一颗树根,由这个“根”,来进行逐步的向下构建。

其设计代码可以表示为:

//树的结点
typedef struct node{
    int data;
    struct node* left;
    struct node* right;
} Node;
  
//树根
typedef struct {
    Node* root;
} Tree;

3.树的创建

如同当时学习链表的创建,首先,我们创建一个空的结点再进行连接,首先将这个空的结点中的date域赋予数据,再判断tree中是否是一个空树,如果为空,只需要将整个根指向这一个结点即可,如果不为空,再进行两个判断,判断输入的数据是否大于或者小于当前比对的结点数据,根据其大小进行相应的排列,这样存储进入的数据总是有一定规律的,在输出的时候根据这个规律进行输出就可以达到想要的效果。

其代码可以显示为:

//创建树--插入数据
void insert(Tree* tree, int value){
    //创建一个节点,让左右指针全部指向空,数据为value
    Node* node=(Node*)malloc(sizeof(Node));
    node->data = value;
    node->left = NULL;
    node->right = NULL;
  
    //判断树是不是空树,如果是,直接让树根指向这一个结点即可
    if (tree->root == NULL){
        tree->root = node;
    } else {//不是空树
        Node* temp = tree->root;//从树根开始
        while (temp != NULL){
            if (value < temp->data){ //小于就进左儿子
                if (temp->left == NULL){
                    temp->left = node;
                    return;
                } else {//继续往下搜寻
                    temp = temp->left;
                }
            } else { //否则进右儿子
                if (temp->right == NULL){
                    temp->right = node;
                    return;
                }
                else {//继续往下搜寻
                    temp = temp->right;
                }
            }
        }
    }
    return;
}

4. 遍历,显示树(要用到递归)

具体的内容将会在后文面的文章细讲,先直接提供一份代码做参考:

//树的中序遍历 In-order traversal
void inorder(Node* node){
    if (node != NULL)
    {
        inorder(node->left);//递归函数,自己调用自己,必须有一个判断方式来结束递归
        printf("%d ",node->data);
        inorder(node->right);
    }
}
//递归在栈段里

5.二叉树的基本创建代码

#include <cstdlib>
#include <stdio.h>
#include <iostream>
  
using namespace std;
  
//树的结点
typedef struct node{
    int data;
    struct node* left;
    struct node* right;
} Node;
  
//树根
typedef struct {
    Node* root;
} Tree;
  
//创建树--插入数据
void insert(Tree* tree, int value){
    //创建一个节点,让左右指针全部指向空,数据为value
    Node* node=(Node*)malloc(sizeof(Node));
    node->data = value;
    node->left = NULL;
    node->right = NULL;
  
    //判断树是不是空树,如果是,直接让树根指向这一个结点即可
    if (tree->root == NULL){
        tree->root = node;
    } else {//不是空树
        Node* temp = tree->root;//从树根开始
        while (temp != NULL){
            if (value < temp->data){ //小于就进左儿子
                if (temp->left == NULL){
                    temp->left = node;
                    return;
                } else {//继续往下搜寻
                    temp = temp->left;
                }
            } else { //否则进右儿子
                if (temp->right == NULL){
                    temp->right = node;
                    return;
                }
                else {//继续往下搜寻
                    temp = temp->right;
                }
            }
        }
    }
    return;
}
  
//树的中序遍历 In-order traversal
void inorder(Node* node){
    if (node != NULL)
    {
        inorder(node->left);
        printf("%d ",node->data);
        inorder(node->right);
    }
}
  
int main(){
    Tree tree;
    tree.root = NULL;//创建一个空树
    int n;
    scanf("%d",&n);
  
    //输入n个数并创建这个树
    for (int i = 0; i < n; i++){
        int temp;
        scanf("%d",&temp);
        insert(&tree, temp);
    }
  
    inorder(tree.root);//中序遍历
  
    return 0;
}

标签:node,Node,结点,NULL,temp,C++,right,二叉树,数据结构
From: https://blog.csdn.net/qq_45398836/article/details/142257937

相关文章

  • C++ 左值和右值
    一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值。我们不能将其绑定到要求转换的表达式、字面常量或是返回右值的表达式(参见2.3.1节,第46页)。右值引用有着完全相反的绑定特性:我们可以将一个右值引用绑定到这类表达式上,但不能将一个右值引用......
  • C++-练习-40
    题目:编写一个程序,她每次读取一个单词,知道用户只输入q。然后,该程序指出有多少个单词以元音大头,而多少个单词以辅音大头,还有多少个单词不属于着两类。源代码:#include<iostream>#include<cctype>//元音:A、E、I、O、Uintmain(){ usingnamespacestd; charword[20];......
  • 南沙C++信奥老师解一本通题:2110:【例5.1】素数环
    ​【题目描述】输入正整数n,把整数1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。【输入】输入正整数n。【输出】输出任意一个满足条件的环。【输入样例】6【输出样例】432561【提示】数据满足:4≤n≤30#include<bits/stdc++.h>usingnamespace......
  • 纯C 生成二叉树广义表 根据广义表重构二叉树
    讲解很多都写在注释里了,重构二叉树的过程后面单独拿出来讲直接上代码:#include<stdio.h>#include<time.h>#include<stdlib.h>#include<limits.h>typedefstructBiTree{ intdata; structBiTree*next[2];}BiTree;BiTree*BiTree_init(intval)//节点初始化{......
  • 南沙C++信奥老师解一本通题 1228:书架
    ​ 【题目描述】John最近买了一个书架用来存放奶牛养殖书籍,但书架很快被存满了,只剩最顶层有空余。John共有NN头奶牛(1≤N≤20,000),每头奶牛有自己的高度Hi(1≤Hi≤10,000),N头奶牛的总高度为S。书架高度为B(1≤B≤S<2,000,000,007)。为了到达书架顶层,奶牛可以踩着其他奶牛的......
  • C++ 教程 #1
    目录1.IDE下载2.基础框架2.1头文件2.2命名空间2.3定义主函数2.4返回值3.变量与常量变(常)量类型表格3.1定义变量3.2定义常量3.3注意事项4.输入与输出4.1输入输出流4.2格式化输入输出5.作业5.1P1001A+BProblem5.2P5708【深基2.习2】三角形面......
  • 《 C++ 修炼全景指南:十 》自平衡的艺术:深入了解 AVL 树的核心原理与实现
    摘要本文深入探讨了AVL树(自平衡二叉搜索树)的概念、特点以及实现细节。我们首先介绍了AVL树的基本原理,并详细分析了其四种旋转操作,包括左旋、右旋、左右双旋和右左双旋,阐述了它们在保持树平衡中的重要作用。接着,本文从头到尾详细描述了AVL树的插入、删除和查找操作,配......
  • C++入门 二(函数重载,引用,超详细!!!)
    文章目录函数重载函数重载的概念引用引用的概念引用特性函数重载函数重载的概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同......
  • 我与C++的爱恋:进程状态(RSDT 阻塞 僵尸 孤儿)
    ​​......
  • HUAWEI(Dev-C++手机版1.1)新加计算,计算崩溃
    #include<iostream>#include<string>#include<conio.h>//注意:这仅在Windows中有效#include<windows.h>#include<cstdlib>#include<ctime>#include<iomanip>//用于格式化时间输出usingnamespacestd;typedeflonglongll;int......