数据结构 --- c语言递归法遍历二叉树

  • 二叉树的单一个体 → 一个节点、两个指针,结构体的定义和双向链表类似

  • 二叉树可以存任何类型的数据:这里选择存 char 类型数据

 二叉树的结构体描述

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Node 
{
	char data;				//顶点数据
	struct Node* LChild;	//左子树指针
	struct Node* RChild;	//右子树指针
}TREE,*LPTREE;

 创建节点

LPTREE createNode(char data) 
{
    //动态内存申请
	LPTREE newNode = (LPTREE)malloc(sizeof(TREE)); 
	assert(newNode);
    //给数据、指针做初始化->对于单个节点左右子树为空
	newNode->data = data;                          
	newNode->LChild = NULL;
	newNode->RChild = NULL;
	return newNode;
}

 插入节点

  • 采用先把节点创建出来,然后再连接的方式

//插在哪个节点后面 插入的左子树的节点 插入的右子树的节点
void insertNode(LPTREE parent, LPTREE LChild, LPTREE RChild) 
{
    //父节点的左子树指针指向左子树传过来的节点
	parent->LChild = LChild;    
    //父节点的右子树指针指向右子树传过来的节点
	parent->RChild = RChild;   
}

 递归法打印

 前序 根左右

//打印以当前节点为根节点的树
void preOrder(LPTREE root) 
{
    //当前节点不为空
	if (root != NULL)                 
	{
        //先打印根节点
		printf("%c", root->data);
        //往左边走   
		preOrder(root->LChild);  
        //往右边走     
		preOrder(root->RChild);      
	}
}

 中序 左根右

void midOrder(LPTREE root) 
{
	if (root != NULL) 
	{
		midOrder(root->LChild);
		printf("%c", root->data);
		midOrder(root->RChild);
	}
}

 后序 左右根

void  lastOrder(LPTREE root) 
{
	if (root != NULL) 
	{
		lastOrder(root->LChild);
		lastOrder(root->RChild);
		printf("%c", root->data);
	}
}

 递归创建 

  • 根据前序遍历的结果进行递归法创建二叉树

  • 会修改表头,传入二级指针

  • 注意需要把 NULL 也放进去

void createTree(LPTREE* T)
{
	char userKey = 0;
	scanf_s("%c", &userKey, 1);                //让用户输入串 用#表示空
	//ABD##EG###C#FH###
	if (userKey == '#')                        //为空
	{
		*T = NULL;                             //让指针指向NULL
	}
	else                                       //不为空
	{
		*T = (LPTREE)malloc(sizeof(TREE));     //动态内存申请 创建节点
		assert(*T);
        //给左右子树做初始化
		(*T)->data = userKey;                  //数据等于用户数据
		createTree(&(*T)->LChild);             //左右子树需要再次创建
		createTree(&(*T)->RChild);
	}
}

 测试代码

int main() 
{
	//创建二叉树->无序的树创建节点
	LPTREE A = createNode('A');    //A节点
	LPTREE B = createNode('B');
	LPTREE C = createNode('C');
	LPTREE D = createNode('D');
	LPTREE E = createNode('E');
	LPTREE F = createNode('F');
	LPTREE G = createNode('G');
	LPTREE H = createNode('H');
    //一个个连接
	insertNode(A, B, C);           //在A下面插入B、C
	insertNode(B, D, E);           //在B下面插入D、E
	insertNode(E, G, NULL);        
	insertNode(C, NULL, F);
	insertNode(F, H, NULL);
    //打印结果
    preOrder(A);                   //ABDEGCFH
	printf("\n");
	
	midOrder(A);                   //DBGEACHF
	printf("\n"); 
	
	lastOrder(A);                  //DGEBHFCA
	printf("\n");
	

    LPTREE A = NULL;              //输入串ABD##EG###C#FH###Enter后得到相同的遍历结果
	createTree(&A);                
	return 0;
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值