二叉树的创建、遍历及销毁

发布于:2024-10-09 ⋅ 阅读:(9) ⋅ 点赞:(0)

头文件:link_tree.h

#ifndef __LINK_TREE_H__
#define __LINK_TREE_H__
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;//类型重定义
typedef struct tree_node
{
	datatype data;//数据域,存储数据
	struct tree_node *left;//存放链式二叉树左节点的指针
	struct tree_node *right;//存放链式二叉树右节点的指针
}tree_node,*node_p;
node_p create_tree();//创建链式二叉树
void show_first(node_p T);//先序遍历
void show_middle(node_p T);//中序遍历
void show_behind(node_p T);//后序遍历
void destroyTree(node_p T);//销毁链式二叉树
#endif

功能函数:link_tree.c

#include "link_tree.h"
//创建链式二叉树
node_p create_tree()
{
	datatype data;
	scanf("%c",&data);
	if(data == '#')//设定一个值来判断是不是要继续创建左右子树
	{
		return NULL;
	}
	//从堆区申请空间存放链表节点
	node_p T=(node_p)malloc(sizeof(tree_node));
	if(NULL == T)
	{
		printf("链表节点创建失败!\n");
		return NULL;
	}
	T->data=data;//存放数据域
	T->left=create_tree();//递归创建左子树
	T->right=create_tree();//递归创建右子树
	return T;
}
//先序遍历(根->左->右)
void show_first(node_p T)
{
	if(NULL == T)
	{
		return;
	}
	printf("%c ",T->data);//先输出根节点
	show_first(T->left);//递归输出左子树节点
	show_first(T->right);//递归输出右子树节点
}
//中序遍历(左->根->右)
void show_middle(node_p T)
{
	if(NULL == T)
	{
		return;
	}
	show_middle(T->left);//递归输出左子树节点
	printf("%c ",T->data);//输出根节点
	show_middle(T->right);//递归输出右子树节点
}
//后序遍历(左->右->根)
void show_behind(node_p T)
{
	if(NULL == T)
	{
		return;
	}
	show_middle(T->left);//递归输出左子树节点
	show_middle(T->right);//递归输出右子树节点
	printf("%c ",T->data);//输出根节点
}
//销毁二叉树
void destroyTree(node_p T){
    if (T == NULL) {
        return;
    }
    // 递归销毁左子树
    destroyTree(T->left);
    // 递归销毁右子树
    destroyTree(T->right);
    // 释放当前节点的内存
    free(T);
}

主函数:main.c

#include "link_tree.h"

int main(int argc, const char *argv[])
{
	node_p T=create_tree();//创建二叉树
	show_first(T);//先序遍历
	printf("\n");
	show_middle(T);//中序遍历
	printf("\n");
	show_behind(T);//后序遍历
	printf("\n");
	destroyTree(T);//销毁二叉树
	return 0;
}