C语言二叉树创建(一定看的懂)

先贴一个百度出来的二叉树的图

二叉树 就是首先得有一个根节点.这个节点的入度为0也就是它只有子节点没有父节点 如1号节点

每个节点又有一个左儿子和一个右儿子 当然也可以没有

接下来就是创建.创建一棵树得现有这棵树的结点和树根

首先来声明一个树的结点

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

当然 int data;这里叫做数据域 也可以多写一些.

然后就是树根了

typedef struct { //树根
	Node* root;
} Tree;

树根创建完了然后就可以写创建树的函数了

void insert(Tree* tree, int value)//创建树
{
    Node* node=(Node*)malloc(sizeof(Node));//创建一个节点
    node->data = value;
    node->left = NULL;
    node->right = NULL;
}

第一个参数是这个树的树根。想想我们的链表 如果头插法的话是不是把头传到函数里面就可以了

第二个节点是值 也就是 我们之前节点的data

第一行动态申请一个空间因为是malloc 出来的所以在堆内存中是有实例的

不会随着函数结束而释放

创建出来以后让左儿子和右儿子为null 让指针初始化的时候指向NULL是一个很好的习惯

然后结点创建出来就要把它连到树里面了。

如果这个树是空树我是不是可以让树根存下这个节点呢?

if (tree->root == NULL)//判断树是不是空树
    {
        tree->root = node;
    }

如果不是空树的话我们可以给一个约束条件

我们规定这个树的父节点小于右儿子又大于左儿子 也就是

左儿子 < 父节点 < 右儿子。

我们先按照这样去约束

所以再树已经不是空树的时候我们就可以从头开始判断

else {//不是空树
        Node* temp = tree->root;//从树根开始
        while (temp != NULL)
        {
         }

小于进左儿子 大于进右儿子

不管进了哪一边我们无非就两种情况有节点或者是NULL

是NULL我们直接让新建的节点就放在这就可以了 然后返回对吗

如果有节点呢?

那我们应该再判断一遍,还是和之前一样。

只要一和前面有重复的操作那我们架个循环跑就好了 对不对

void insert(Tree* tree, int 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;
}

好了 创建的函数结束了 

然后遍历二叉树 一般用中序遍历

因为用中序遍历可以从小到大去遍历如果不懂的可以去查一下

好了来一发完整代码

#include <cstdlib>
#include <stdio.h>


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

typedef struct { //树根
    Node* root;
} Tree;

void insert(Tree* tree, int 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;
}

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);
    for (int i = 0; i < n; i++)//输入n个数并创建这个树
    {
        int temp;
        scanf("%d",&temp);
        insert(&tree, temp);
    }
    inorder(tree.root);//中序遍历
    getchar(); getchar();
    return 0;
}

未经允许,不得转载

猜你喜欢

转载自blog.csdn.net/qq_42011541/article/details/80547098