一.对于二叉树的创建。
首先我们创建一个树的节点:
ypedef 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 preorder(Node *node) //树的先序遍历
{
if(node!=NULL)
{
printf("%d ",node->data);
preorder(node->left);
preorder(node->right);
}
}
在这里插入代码片
中序遍历:先中序遍历左子树,再访问根结点,最后中序遍历右子树
void inorder(Node* node) //树的中序遍历
{
if(node!=NULL)
{
inorder(node->left);
printf("%d ",node->data);
inorder(node->right);
}
}
在这里插入代码片
后序遍历:先后序遍历左子树,再后序遍历右子树,最后访问根结点
void epilogue(Node *node) //树的后序遍历
{
if(node!=NULL)
{
epilogue(node->left);
epilogue(node->right);
printf("%d ",node->data);
}
}
在这里插入代码片
到这里任务基本完成,下面是完整代码
#include<stdio.h>
#include<stdlib.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 preorder(Node *node) //树的先序遍历
{
if(node!=NULL)
{
printf("%d ",node->data);
preorder(node->left);
preorder(node->right);
}
}
void inorder(Node* node) //树的中序遍历
{
if(node!=NULL)
{
inorder(node->left);
printf("%d ",node->data);
inorder(node->right);
}
}
void epilogue(Node *node) //树的后序遍历
{
if(node!=NULL)
{
epilogue(node->left);
epilogue(node->right);
printf("%d ",node->data);
}
}
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);
}
preorder(tree.root); //前序遍历
printf("\n");
inorder(tree.root); //中序遍历
printf("\n");
epilogue(tree.root); //后序遍历
printf("\n");
return 0;
}
在这里插入代码片