从后缀表达式建立表达式树

怎么想起总结算法了

在一个公司呆久了,不出去看看,你永远不知道你的水平如何,你值多少钱。也就是说,作为一个技术人员,应该每隔4、5个月,出去参加几次面试,看看自己的技术水平有没有和IT圈脱节。但更多的是在寻找更好的机会,找一份更适合自己,待遇更高的工作。 好了,从今天起,每天都总结一个小的数据结构与算法知识,一来扩充自己的知识;二来你懂的。

二叉树的遍历

对于二叉树无非就三种遍历方式:

  • 前序遍历;
  • 中序遍历;
  • 后序遍历;

对于这三种遍历方式,我通过下面这张图来详细的介绍一下我的方法。 alt

  • 前序遍历:访问根节点->遍历左子树->遍历右子树
  • 中序遍历:遍历左子树->访问根节点->遍历右子树
  • 后序遍历:遍历左子树->遍历右子树->访问根节点

对于上图中的二叉树,分别使用三种遍历得到的结果分别是:

  • 前序遍历:A->C->D->G->H->S
  • 中序遍历:D->C->G->A->H->S
  • 后序遍历:D->G->C->S->H->A

二叉树的主要用处之一是在编译器设计领域,如下图所示的二叉树: alt

这是一个颗表达式树,对这个二叉树进行后续遍历,得到的结果是:
a b + c d e + d * *
而这种表达式也叫做后缀表达式,很多时候,我们需要根据后缀表达式重新建立一颗二叉树。下面就使用代码实现这种需求。

从后缀表达式建立表达式树

比如现在有以下一个后缀表达式:
a b + c d e + * *
根据这个后缀表达式建立二叉表达式树,算法如下:
1. 依次读取表达式;
2. 如果是操作数,则将该操作数压入栈中;
3. 如果是操作符,则弹出栈中的两个操作数,第一个弹出的操作数作为右孩子,第二个弹出的操作数作为左孩子;然后再将该操作符压入栈中。

这样下去,就可以建立一颗完整的表达式树。

代码简单实现

下面就使用C++代码进行了简单的实现。

定义树节点信息。

typedef struct BinaryNode
{
    char data;
    BinaryNode *left;
    BinaryNode *right;
}TreeNode;

创建一个新的节点。

TreeNode* CreateTreeNode(char ch)
{
    TreeNode *pNode = new TreeNode;
    pNode->data = ch;
    pNode->left = NULL;
    pNode->right = NULL;
    return pNode;
}

读取表达式,创建表达式树。

stack<TreeNode *> nodeStack;

char ch;
while ((ch = getchar()) != '\n')
{
    TreeNode *pNode = CreateTreeNode(ch);
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
    {
        TreeNode *pRight = nodeStack.top();
        nodeStack.pop();
        TreeNode *pLeft = nodeStack.top();
        nodeStack.pop();

        pNode->right = pRight;
        pNode->left = pLeft;
        nodeStack.push(pNode);
    }
    else
    {
        nodeStack.push(pNode);
    }
}

 文章来源:http://www.jellythink.com/archives/688

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值