二叉树的括号表达式转成二叉链存储结构

【问题描述】假设二叉树中每个结点值均为单个字符,采用链式的存储结构。分别输出该二叉树先序遍历中序遍历和后序遍历的结果。
【输入形式】

第一行:以括号表示法输入该二叉树的所有结点
【输出形式】

第一行:输出先序遍历的结果

第二行:输出中序遍历的结果

第三行:输出后序遍历的结果
【样例输入】

a(c,b)
【样例输出】

acb

cab

cba
【样例说明】

符号均为半角符号,中间无空格,输入字符串的长度不超过N(N<=100)

这次的变成题目是根据括号表达式匹配转化成二叉树链存储的形式

这道题目的整体思路:

Step1:将括号表达式转化成二叉链的存储结构

Step2:再依次先中后遍历输出节点

注意这里遇到左右括号,逗号时不同的处理方式。

遇到左括号时说明刚刚读取的节点有孩子,应该将其入栈,并指示flag,下一个节点为左孩子;逗号修改flag值;右括号将top节点出栈,表示已经处理完这个节点。其他遇到节点情况,先判断是否跟节点为空(这里root的初始化不能简单BTNode *root;此时并不为空,应该是BTNode *root=NULL;)不注意的话可能会陷入奇奇怪怪的循环之中。

#include <iostream>
#include <stack>
#include <string>
using namespace std;

struct BTNode
{
    char val;
    BTNode *lchild;
    BTNode *rchild;
    BTNode()
    {
        lchild = rchild = NULL;
    }
    BTNode(char cc)
    {
        lchild = rchild = NULL;
        val = cc;
    }
};

void xian(BTNode *p)
{
    if (p != NULL)
    {
        cout << p->val;
        xian(p->lchild);
        xian(p->rchild);
    }
}

void hou(BTNode *p)
{
    if (p != NULL)
    {

        hou(p->lchild);
        hou(p->rchild);
        cout << p->val;
    }
}

void zhong(BTNode *p)
{
    if (p != NULL)
    {
        zhong(p->lchild);
        cout << p->val;

        zhong(p->rchild);
    }
}
int main()
{
    string str;
    stack<BTNode *> st;
    BTNode *root = NULL;
    BTNode *p;
    // 注意上面两行对于节点初始化的不同
    bool flag;
    cin >> str;

    int i = 0;
    while (i < str.length())
    {
        switch (str[i])
        {
        case '(':
            st.push(p);
            flag = false;
            break;
        case ',':
            flag = true;
            break;
        case ')':
            st.pop();
            break;

        default:
            p = new BTNode(str[i]);
            if (root == NULL)
            {
                root = p;
            }
            else
            {
                if (!st.empty() && !flag)
                {
                    st.top()->lchild = p;
                }

                if (!st.empty() && flag)
                {
                    st.top()->rchild = p;
                }
            }
        }
        i++;
    }
    xian(root);
    cout << endl;
    zhong(root);
    cout << endl;
    hou(root);
    cout << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值