数据结构复习4.1 后缀表达式转中缀表达式与前缀表达式- 二叉树实现

之前总结了利用栈来将中缀表达式转为后缀与前缀表达式的规则(中缀表达式转前/后缀规则),并且附上了代码。最近复习到了树,正好使用二叉树来实现一下。

表达式树

表达式长成下面这个样子:
下图为:
后缀表达式 :ACB*+D/ 的表达式树。
前缀表达式为:/ + A * C B D
中缀表达式为: A + C * B / D
在这里插入图片描述

如何构造表达式树

从左到右遍历表达式,如果遇到操作数则推入栈中,如果为操作符则将占中的操作数拿出,再以操作符为根构建一棵树,此后将刚刚构建的以操作符为根的二插入放入栈中。
步骤如下所示:

  1. 以后缀表达式 ACB*+D/为例,从左到右开始遍历,前三个都是操作, 先创建操作数节点,之后再将节点放入栈中。
    如下所示:
    在这里插入图片描述
  2. 随着遍历的执行,会遇到操作符 *(乘号),接下来我们需要pop两次,将B和Cpop出来,以乘号为根,构建二叉树。
    如下图所示:
    在这里插入图片描述
  3. 将根节点放入栈中。
    在这里插入图片描述
  4. 继续向后遍历,如此往复之后完成遍历。最后栈中会有一个根节点。将根节点拿出后,可以得到一整棵表达式树。

实现

//
//  Expression_Tree.c
//  Data_structure
//
//  Created by 양송 on 2020/05/30.
//  Copyright © 2020 양송. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define Stack_Size 20

typedef struct node
{
   
    char data;
    struct node* left;
    struct node* right;
}Bin_T;

Bin_T* Stack[Stack_Size];
int Top = -1;

int Stack_Empty()
{
   
    if(Top == -1)
    {
   
        return 1;//return empty
    }
    else
        return 0;
}

int Stack_Full()
{
   
    if(Top == Stack_Size-1)
    {
   
        return 
以下是一个简单的实现实现了通过前缀表达式构建二叉树: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_EXPR_LEN 100 typedef struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct StackNode { TreeNode *val; struct StackNode *next; } StackNode; typedef struct Stack { StackNode *top; } Stack; Stack* createStack() { Stack *s = (Stack*) malloc(sizeof(Stack)); s->top = NULL; return s; } void push(Stack *s, TreeNode *val) { StackNode *n = (StackNode*) malloc(sizeof(StackNode)); n->val = val; n->next = s->top; s->top = n; } TreeNode* pop(Stack *s) { if (s->top == NULL) { return NULL; } TreeNode *val = s->top->val; StackNode *temp = s->top; s->top = s->top->next; free(temp); return val; } TreeNode* buildExprTree(char *expr) { Stack *s = createStack(); int len = strlen(expr); for (int i = len - 1; i >= 0; i--) { char c = expr[i]; if (isdigit(c)) { TreeNode *n = (TreeNode*) malloc(sizeof(TreeNode)); n->val = c; n->left = NULL; n->right = NULL; push(s, n); } else { TreeNode *n = (TreeNode*) malloc(sizeof(TreeNode)); n->val = c; n->left = pop(s); n->right = pop(s); push(s, n); } } TreeNode *root = pop(s); free(s); return root; } void inOrderTraversal(TreeNode *root) { if (root == NULL) { return; } inOrderTraversal(root->left); printf("%c ", root->val); inOrderTraversal(root->right); } int main() { char expr[MAX_EXPR_LEN]; printf("请输入前缀表达式:"); scanf("%s", expr); TreeNode *root = buildExprTree(expr); printf("中序遍历结果:"); inOrderTraversal(root); printf("\n"); return 0; } ``` 这段代码同样通过一个栈来辅助构建表达式二叉树,不同之处在于它是从前往后遍历表达式字符串。对于每个字符,如果是数字则创建一个只包含该数字的叶子节点,如果是运算符则创建一个新的节点,并将栈顶的两个节点分别作为右左子连接到该节点上(注意顺序),然后将该节点压入栈中。最后,栈中仅剩的一个节点就是构建好的表达式二叉树的根节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值