作业要求:
编写程序实现二叉树的创建,三种遍历自己销毁
作业答案:
作业代码截图
作业代码效果图
作业代码
#include "myhead.h"
// 定义二叉树节点结构体
struct Tree
{
int value; //编号(值)
struct Tree* left; //左子树
struct Tree* right; //右子树
};
// 创建新节点
struct Tree* create_node(int value)
{
//动态申请空间
struct Tree* new = (struct Tree*)malloc(sizeof(struct Tree));
//节点内部初始化
new->value = value;
new->left = NULL;
new->right = NULL;
return new;
}
// 创建二叉树
struct Tree* create_tree()
{
//创建根节点,编号(值)为1
struct Tree* root = create_node(1);
//创建根节点的左孩子节点,编号(值)为2
root->left = create_node(2);
//创建根节点的右孩子节点,编号(值)为3
root->right = create_node(3);
//以下两个步骤可以放在需要增加二叉树节点时再进行,此处只是为了一次性构建出一个比较详细的二叉树
//创建根节点的左孩子节点的左孩子节点,编号(值)为4
root->left->left = create_node(4);
//创建根节点的左孩子节点的右孩子节点,编号(值)为5
root->left->right = create_node(5);
return root;
}
// 前序遍历 依次遍历根节点、左子树、右子树,直到所有节点都被遍历完毕
void preorder(struct Tree* node)
{
//当节点不为空时
if (node != NULL)
{
//打印当前节点的编号(或者说,值)
printf("%d ", node->value);
//递归调用前序遍历函数,传参为当前节点的左孩子节点
preorder(node->left);
//递归调用前序遍历函数,传参为当前节点的右孩子节点
preorder(node->right);
}
}
// 中序遍历 依次遍历左子树、根节点、右子树,直到所有节点都被遍历完毕
void midorder(struct Tree* node)
{
//当节点不为空时
if (node != NULL)
{
//递归调用中序遍历函数,传参为当前节点的左孩子节点
midorder(node->left);
//打印当前节点的编号(或者说,值)
printf("%d ", node->value);
//递归调用中序遍历函数,传参为当前节点的右孩子节点
midorder(node->right);
}
}
// 后序遍历 依次遍历左子树、右子树、根节点,直到所有节点都被遍历完毕
void lastorder(struct Tree* node)
{
//当节点不为空时
if (node != NULL)
{
//递归调用后序遍历函数,传参为当前节点的左孩子节点
lastorder(node->left);
//递归调用后序遍历函数,传参为当前节点的右孩子节点
lastorder(node->right);
//打印当前节点的编号(或者说,值)
printf("%d ", node->value);
}
}
// 销毁二叉树 采用后序的方式进行二叉树的销毁,这样可以完全销毁二叉树
void destroy_tree(struct Tree* node)
{
//当节点不为空时
if (node != NULL)
{
//递归调用销毁函数,传参为当前节点的左孩子节点
destroy_tree(node->left);
//递归调用销毁函数,传参为当前节点的右孩子节点
destroy_tree(node->right);
//释放当前节点的空间,即销毁当前节点
free(node);
}
}
//主函数
int main(int argc,const char * argv[])
{
//定义二叉树的根节点,并同时创建一个二叉树
struct Tree* root = create_tree();
//前序遍历二叉树
printf("前序遍历: ");
preorder(root);
//中序遍历二叉树
printf("\n中序遍历: ");
midorder(root);
//后序遍历二叉树
printf("\n后序遍历: ");
lastorder(root);
//为了结果美观,加一个换行
putchar(10);
//销毁二叉树
destroy_tree(root);
return 0;
}