二叉树存储、创建、结点设计、遍历…C语言示例代码

2022-07-1716:08:02数据结构与算法Comments1,032 views字数 3464阅读模式

二叉树存储文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

1. 简介文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

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

2. 结点设计文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

一颗二叉树的结点设计一定要有如下内容:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

a)结点元素,data域,用来存储数据,其可以是int,char等基本的类型,同时也可以是struct等这些复杂的复合数据类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

b)左孩子结点,left指针,总是用来指向当前结点的下一层的左边结点,其属于一种指针。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

c)右孩子结点,right指针,总是用来指向当前结点的下一层的右边结点,其属于一种指针。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

d)父结点(可选),parent指针,总是指向当前结点的前一个结点,简称父亲结点,其不属于必须结点设计,省略掉可以打扰节省内存的效果,而使用则可以更方便进行定向搜索,本案例中不使用父节点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

以上就是一颗二叉树的结点设计,除此之外,我们使用一棵树的时候需要建立一颗树根,由这个“根”,来进行逐步的向下构建。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

其设计代码可以表示为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

1
2
3
4
5
6
7
8
9
10
11
//树的结点
typedef struct node{
    int data;
    struct node* left;
    struct node* right;
} Node;
 
//树根
typedef struct {
    Node* root;
} Tree;

3.树的创建文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

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

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

其代码可以显示为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

//创建树--插入数据
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. 遍历,显示树文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

具体的内容将会在后文面的文章细讲,先直接提供一份代码做参考:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

//树的中序遍历 In-order traversal
void inorder(Node* node){
    if (node != NULL)
    {
        inorder(node->left);
        printf("%d ",node->data);
        inorder(node->right);
    }
}

本文代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html

#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;
}
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25160.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/25160.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定