二叉树的常用操作函数

二叉树的常用操作函数  未完待续。。。

 

/*包含二叉树常用操作函数*/
/*未完待续...*/
tree *creat(tree *root) // 以一个字符串为例 构建二叉树
{
    if (str[cnt] == ',') // 此字符串为全局
    {
        cnt++; // 计数的全局变量
        return NULL;
    }
    root = new tree;
    root->c = str[cnt++];
    root->l = creat(root->l);
    root->r = creat(root->r);
    return root;
}

tree *show_mid(tree *root) // 前序遍历
{
    if (root)
    {
        cout << root->data;
        show_mid(root->l);
        show_mid(root->r);
    }
}
tree *show_mid(tree *root) // 中序遍历
{
    if (root)
    {
        show_mid(root->l);
        cout << root->data;
        show_mid(root->r);
    }
}

tree *show_back(tree *root) // 后序遍历
{
    if (root)
    {
        show_back(root->l);
        show_back(root->r);
        cout << root->data;
    }
}

void show(tree *root) // 层序遍历二叉树 // 通过队列实现
{
    queue<tree *> q;
    if (root)
        q.push(root); // 树存在的 进入队列
    while (!q.empty())
    {
        root = q.front();
        q.pop();
        if (root)
        {
            cout << root->c;
            q.push(root->l);
            q.push(root->r);
        }
    }
}

void tree_back(int len, char *s1, char *s2, char *ans) // 由先序和中序推出二叉树的后序
{                                                      // s1为先序  s2为中序
    int i;
    if (len <= 0) // 递归边界 长度为0时
        return;
    for (i = 0; i < len; i++)
    {
        if (s2[i] == s1[0])
            break;
    }
    tree_back(i, s1 + 1, s2, ans);                           // 遍历左子树
    tree_back(len - i - 1, s1 + i + 1, s2 + i + 1, ans + i); // 遍历右子树
    ans[len - 1] = s1[0];                                    // 存入后序数组
}

void tree_front(int len, char *s1, char *s2) // 由中序和后序推出二叉树前序
{                                            // s1中序s2后序
    if (len <= 0)
        return;
    int i = strchr(s1, s2[len - 1]) - s1; // 从s1中搜索s2[len-1] 并返回地址,地址减去首地址即为子树长度
    ans[cnt++] = s2[len - 1];
    tree_front(i, s1, s2);                       // 递归搜索左子树
    tree_front(len - i - 1, s1 + i + 1, s2 + i); //递归搜素右子树 存到地址之后
}

tree *make_tree_from_frontmid(int len, char *s1, char *s2) // 根据前序和中序建立二叉树
{
    int i;
    tree *root;
    if (len <= 0) // 递归边界 如果len为0则不能建树
        return NULL;
    root = new tree; // new一个新节点
    root->c = s1[0];
    for (i = 0; i < len; i++)
    {
        if (s2[i] == s1[0]) // 在中序中寻找根节点
            break;
    }
    root->l = make_tree_from_frontmid(i, s1 + 1, s2);                       // 递归建立左子树
    root->r = make_tree_from_frontmid(len - i - 1, s1 + i + 1, s2 + i + 1); // 递归建立右子树
    return root;
}

tree *make_tree_from_midback(int len, char *s1, char *s2) // 根据中序和后序建立二叉树
{                                                         // s1中序s2后序
    tree *root;
    if (len <= 0)
        return NULL;
    int i = strchr(s1, s2[len - 1]) - s1; // 从s1中搜索s2[len-1] 并返回地址,地址减去首地址即为子树长度
    root = new tree;
    root->c = s2[len - 1];
    root->l = make_tree_from_midback(i, s1, s2);                       // 递归搜索左子树
    root->r = make_tree_from_midback(len - i - 1, s1 + i + 1, s2 + i); //递归搜素右子树 存到地址之后
    return root;
}

void show(tree *root) // 层序遍历二叉树 通过队列实现
{                     // 从上到下  从左到右
    queue<tree *> q;
    if (root) // 树存在 则入队
        q.push(root);
    while (!q.empty())
    {
        root = q.front();
        q.pop();
        if (root)
        {
            cout << root->c;
            q.push(root->l); // 左右树依次进队
            q.push(root->r);
        }
    }
}

int count_leaves(tree *root) // 求二叉树的子叶个数
{
    int ans = 0;
    if (root)
    {
        if (root->l == NULL && root->r == NULL)
            ans++;             // 子叶数++
        count_leaves(root->l); // 递归计算左子树
        count_leaves(root->r); // 递归计算右子树
    }
}

int tree_height(tree *root) // 求二叉树的高度 递归实现
{
    if (root) // 当树存在的时候
    {
        int leftcnt = tree_height(root->l);
        int rightcnt = tree_height(root->r);
        return (leftcnt > rightcnt) ? leftcnt + 1 : rightcnt + 1;
    }
    else
        return 0;
}

void print_leaves(tree *root) // 输出二叉树的叶子
{                             // 层序遍历原理 从上到下从做到右 正好能按相应的的顺序输出 子叶
    queue<tree *> q;
    if (root)
        q.push(root);
    while (!q.empty())
    {
        root = q.front(); //访问队首元素
        q.pop();          //删除队首
        if (root)
        {
            if (root->l == NULL && root->r == NULL)
                cout << root->c;
            q.push(root->l); // 左子树进入队列
            q.push(root->r); // 右子树进入队列
        }
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值