作业要求:
编写程序实现二叉树的创建,三种遍历自己销毁
作业答案:
作业代码截图
作业代码效果图
作业代码
#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()
{//创建根节点,编号(值)为1struct Tree* root = create_node(1);//创建根节点的左孩子节点,编号(值)为2root->left = create_node(2);//创建根节点的右孩子节点,编号(值)为3root->right = create_node(3);//以下两个步骤可以放在需要增加二叉树节点时再进行,此处只是为了一次性构建出一个比较详细的二叉树//创建根节点的左孩子节点的左孩子节点,编号(值)为4root->left->left = create_node(4);//创建根节点的左孩子节点的右孩子节点,编号(值)为5root->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;
}