数据结构代码题Day07--对应视频<Day47>

该博客主要介绍了如何通过中序遍历方式,按照特定规则输出中缀表达式对应的二叉树。算法思路是通过递归的中序遍历,在遍历过程中判断节点类型,决定是否添加括号,从而实现正确格式的括号输出。代码中包含了模板代码的改进,特别处理了叶子节点和非根非叶子节点的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构代码题Day07

在这里插入图片描述

题目分析

题目中给出的中缀表达式的对应二叉树如下图所示:

在这里插入图片描述

题目分析

1、应该采用何种方式进行输出打印二叉树的各个结点的数值?
根据上图的中缀表达式的输出形式,可以得到这是二叉树的中序遍历
因此我们采用中序遍历进行输出打印。

2、对于加括号的问题如何解决?
先看图:
在这里插入图片描述
结合上述的图片描述可以得到:

一. 根节点不加括号;
二. 叶子节点不加括号
三. 非根节点和非叶子节点不加括号。

明白了何时加括号和不加括号的问题后,对下一个问题进行分析:

3、如何加括号?

一. 根据上图的仔细观察发现
二. 在中序遍历子树之前左括号
三. 在中序遍历子树之后右括号

算法思想描述

  1. 代码采用中序遍历递归进行求解;
  2. 在模板代码中对中序遍历进行改进;
  3. 在访问左子树之前左括号
  4. 在访问右子树之后右括号

算法实现

  • 中序遍历二叉树模板代码
void MiddleOrder(BiTree * root){
	if(root == NULL){
		return ;
	}
	if(root != NULL){
		MiddleOrder(root->lchild);
		visit(root->data);//中序遍历核心
		MiddleOrder(root->rchild);
	}
}

1、模板代码改进1

  • 改进第一处,首先是叶子结点的输出,这个步骤较为简单,代码如下:
	if(root == NULL){//根节点为NULL
		return ;
		//找到了叶子结点
	}else if(root->lchild ==NULL  && root->rchild == NULL){
		printf("%s",root->data);//打印输出叶子结点
	}else{
		//第二部的改进代码编写位置
	}
  • 对于非叶子结点非根节点的部分进行改进,
  • 改进原则是在中序访问左子树之前进行加做左括号
  • 在访问右子树之后加右括号

2、模板代码改进2

  • 递归访问左子树之前加左括号
		//改进位置
		if(depth > 1){//说明左子树存在
			//中序遍历左子树之前加左括号
			printf("(");
		}
		//等同于
		if(root->lchild != NULL){//说明左子树存在
			//中序遍历左子树之前加左括号
			printf("(");
		}
  • 访问右子树之后加入右括号
		if(depth > 1){//说明右子树不为空
			//遍历右子树之后加右括号
			printf(")");
		}
		//等同于
		if(root->lchild != NULL){//说明右子树存在
			//中序遍历右子树之前加左括号
			printf(")");
		}
  • 结合上述,得到函数操作代码:
void MiddleOrder(BiTree * root,int depth){
	if(root == NULL){
		return ;
	}else if(root->lchild ==NULL  && root->rchild == NULL){
		printf("%s",root->data);
	}else{
		//改进位置
		if(depth > 1){//说明左子树存在
			//中序遍历左子树之前加左括号
			printf("(");
		}

		//中序遍历核心代码
		MiddleOrder(root->lchild,depth+1);//表示进入下一层了
		//访问根节点
		printf("%s",root=>data);

		MiddleOrder(root->rchild,depth+1);


		if(depth > 1){//说明右子树不为空
			//遍历右子树之后加右括号
			printf(")");
		}
	}
}
  • 由于depth没有初始数值,因此我们要对depth赋初值
void Fun(BiTree * root){
	MiddleOrder(root,1);//赋初值
}

完整程序代码

typedef struct node{
    char data[10];
    struct node *left,*right;
}BTree;
//操作函数
void MiddleOrder(BiTree * root,int depth){
	if(root == NULL){
		return ;
	}else if(root->left==NULL  && root->right== NULL){
		printf("%s",root->data);
	}else{
		//改进位置
		if(depth > 1){//说明左子树存在
			//中序遍历左子树之前加左括号
			printf("(");
		}

		//中序遍历核心代码
		MiddleOrder(root->left,depth+1);//表示进入下一层了
		//访问根节点
		printf("%s",root=>data);

		MiddleOrder(root->right,depth+1);


		if(depth > 1){//说明右子树不为空
			//遍历右子树之后加右括号
			printf(")");
		}
	}
}
//启动函数初始化depth
void Fun(BiTree * root){
	MiddleOrder(root,1);//赋初值
}
	printf("数据结构算法学习加油!!!");

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值