数据结构代码题Day07
题目分析
题目中给出的中缀表达式的对应二叉树如下图所示:
题目分析
1、应该采用何种方式进行输出打印二叉树的各个结点的数值?
根据上图的中缀表达式的输出形式,可以得到这是二叉树的中序遍历。
因此我们采用中序遍历进行输出打印。
2、对于加括号的问题如何解决?
先看图:
结合上述的图片描述可以得到:
一. 根节点不加括号;
二. 叶子节点不加括号
三. 非根节点和非叶子节点不加括号。
明白了何时加括号和不加括号的问题后,对下一个问题进行分析:
3、如何加括号?
一. 根据上图的仔细观察发现
二. 在中序遍历左子树之前加左括号
三. 在中序遍历右子树之后加右括号
算法思想描述
- 代码采用中序遍历递归进行求解;
- 在模板代码中对中序遍历进行改进;
- 在访问左子树之前加左括号
- 在访问右子树之后加右括号
算法实现
- 中序遍历二叉树模板代码
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("数据结构算法学习加油!!!");