数据结构专周15

一棵二叉树输出从根节点到叶子结点F的路径并求出叶子结点所在的层次

思路

用括号表达式来建立二叉树

建立过程:

遇到 '(' 则将前一个节点入栈

遇到 ')' 则将栈顶pop

遇到 ‘,’ 则将该节点得准备得儿子节点由左转到右 //我用一个数组标记

代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
    char ch;
    int lch, rch;
};
node tree[1000];
string s;
int idx = 0;
int head[1000];
void creat()
{
    stack<int> sta;
    sta.push(1);
    for (int i = 0; i < s.size(); i++) //遍历括号序列
    {
        int id = sta.top();
        if (s[i] <= 'Z' && s[i] >= 'A') //是字符就插入栈顶得id 得lch 或者 rch
        {
            tree[++idx].ch = s[i]; //新节点
            if (head[id])          //判断是左还是右父节点->儿子
                tree[id].rch = idx;
            else
                tree[id].lch = idx;
            if (s[i + 1] == '(') //左括号入栈
            {
                sta.push(idx);
                i++;
            }
        }
        else if (s[i] == ')') //右括号出栈
        {
            sta.pop();
        }
        else if (s[i] == ',') //遇到','lch 变成 rch
        {
            head[id]++;
        }
    }
}
void out(int id) //输出二叉树
{
    cout << tree[id].ch;
    int f = 0;

    if (tree[id].lch)
    {
        if (!f)
            cout << '(';
        f = 1;
        out(tree[id].lch);
        cout << ",";
    }
    if (tree[id].rch)
    {
        if (!f)
            cout << "(,";
        f = 1;
        out(tree[id].rch);
    }
    if (f)
        cout << ')';
}
int ff = 0;
void find(char ch, int id)
{
    if (ff)
        cout << "->";
    ff = 1;
    cout << tree[id].ch;
    if (tree[id].ch == ch)
        return;
    if (tree[id].lch)
        find(ch, tree[id].lch);
    if (tree[id].rch)
        find(ch, tree[id].rch);
}
void dfs(int num, int id)
{
    cout << tree[id].ch << "深度为: " << num << endl;
    if (tree[id].lch)
        dfs(num + 1, tree[id].lch);
    if (tree[id].rch)
        dfs(num + 1, tree[id].rch);
}
int main()
{
    cin >> s; // A(B(,O),C(F,K))
    creat();
    cout << "建立得二叉树用括号表达式表示" << endl;
    out(1);
    cout << endl;
    find('K', 1);
    cout << endl;
    dfs(1, 1);
}

运行结果

//输入:A(B(,O),C(F,K))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XXX_xxxx__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值