先贴一个百度出来的二叉树的图
二叉树 就是首先得有一个根节点.这个节点的入度为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;
}
---------------------
作者:TheSevenSky
来源:CSDN
原文:https://blog.csdn.net/qq_42011541/article/details/80547098