C++数据结构根据数组建立链式二叉树

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class btree
{
public:
    char value;
    btree *l;
    btree *r;
    btree(char val) : value(val), l(nullptr), r(nullptr){};
    btree(char val, btree *lp, btree *rp) : value(val), l(lp), r(rp){};
};
struct items//这个是数据格式的要求,left和right是数组索引.
{
    char value;
    int left, right;
    items(char val, int l, int r) : value(val), left(val), right(val){};
};
btree *build(char *arr, int cur, int len, char no) //树的节点数组,始点和终点,
//no是空节点标志字符
{
    btree *root = nullptr;
    if (cur >= len || arr[cur] == no)
    {
        return root;//如果不能再建立节点,就直接返回一个空节点
    }
//否则就给节点赋值,并把左右子节点给确定下来,用到了递归,建议认真思考下。
    root = new btree(arr[cur], build(arr, cur * 2 + 1, len, no), build(arr, cur * 2 + 2, len, no));
    return root;
}
void pre(btree *root)//先序
{
    if (root == nullptr)
    {
        return;
    }
    cout << root->value << endl;
    pre(root->l);
    pre(root->r);
}
void in(btree *root)
{
    if (root == nullptr)
    {
        return;
    }

    pre(root->l);
    cout << root->value << endl;
    pre(root->r);
}
void aft(btree *root)
{
    if (root == nullptr)
    {
        return;
    }

    pre(root->l);
    pre(root->r);
    cout << root->value << endl;
}
void layer(btree *root)//层序,非递归写起来比较好理解
{
    queue<btree *> q1;
    queue<btree *> q2;//第一层放q1,第二层从q1里衍生出来子节点放q2,反复如此
    q1.push(root);
    while (!q2.empty() || !q1.empty())
    {
        if (q2.empty())
        {
            while (!q1.empty())
            {
                btree *front = q1.front();
                cout << front->value << ' ';
                q1.pop();
                if (front->l != nullptr)
                {
                    q2.push(front->l);
                }
                if (front->r != nullptr)
                {
                    q2.push(front->r);
                }
            }
        }

        else if (q1.empty())
        {
            while (!q2.empty())
            {
                btree *front = q2.front();
                cout << front->value << ' ';
                q2.pop();
                if (front->l != nullptr)
                {
                    q1.push(front->l);
                }

                if (front->r != nullptr)
                {
                    q1.push(front->r);
                }
            }
        }
        cout << endl;
    }
}
int getDepth(btree *p)//节点p的子树深度
{
    if (p == nullptr)
    {
        return 0;
    }
    return max(getDepth(p->l), getDepth(p->r)) + 1;
}
bool isSame(const btree *q1, const btree *q2)//判断q1,q2是否同构,拍脑袋想出来的,不知道对不对,感觉挺合理的,网上的版本结构太复杂了
{
    if (q1 == nullptr && q2 == nullptr)
        return true;
    if (q1 != nullptr && q2 == nullptr || q2 != nullptr && q1 == nullptr)
        return false;
    return q1->value == q2->value && ((isSame(q1->l, q2->r) && isSame(q1->r, q2->l)) || (isSame(q1->l, q2->l) && isSame(q1->r, q2->r)));
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

心宿二、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值