数据结构之二叉树的基本操作

本文介绍了一种使用递归和非递归方法遍历二叉树的算法,包括前序、中序和后序遍历,并演示了如何计算二叉树的深度和节点数量。通过具体的代码实现,展示了链栈在非递归中序遍历中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次实验的内容有:

1、前序遍历生成二叉树;
2、前序、中序、后序遍历上述生成的二叉树(使用递归);
3、使用非递归方式中序遍历二叉树;
4、输出二叉树的深度、节点个数。

本来写的是顺序栈,后来看栈中存的是指针,就改成链栈了。
另外在创建二叉树的时候,用#代表空位置。
接下里是运行图片:
在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
typedef struct BiTnode{
    char data;
    struct BiTnode *lchild,*rchild;
}BiTnode,*BiTtree;
typedef struct Linknode{        //创建链栈
    BiTnode *data;
    struct Linknode *next;
}*Linkstack,Linknode;
void create(BiTtree &T)
{
    char data;
    cin >> data;
    if(data == '#')
    {
        T = NULL;
    }
    else{
        T = new BiTnode;
        T -> data = data;
        create(T -> lchild);
        create(T -> rchild);
    }
}
void createstack(Linkstack &S)
{
   S = NULL;
}
int emptystack(Linkstack &S)
{
    if(S == NULL)
        return 1;
    else
        return 0;
}
int push(Linkstack &S,BiTtree p)
{
    Linknode *q;
    q = new Linknode;
    q -> data = p;
    q -> next = S;
    S = q;
    return 1;
}
 BiTtree pop(Linkstack &S)
{
    BiTnode *p;
    p = S -> data;
    S = S -> next;
    return p;
}
void preorder(BiTtree T)
{
    if(T)
    {
        cout << T -> data << ' ';
        preorder(T -> lchild);
        preorder(T -> rchild);
    }
}

void inorder(BiTtree T)
{
    if(T)
    {
        inorder(T -> lchild);
        cout << T -> data << ' ';
        inorder(T -> rchild);
    }
}
void postorder(BiTtree T)
{
    if(T)
    {
        postorder(T -> lchild);
        postorder(T -> rchild);
        cout << T -> data << ' ';
    }
}
int stacksize(Linkstack &S)
{
    int num = 0;
    Linknode *p;
    p = S;
    while(p)
    {
        num++;
        p = p -> next;
    }
    return num;
}
void stackinorder(BiTtree &T)
{
    Linkstack S;
    createstack(S);
    BiTnode *p,*q;
    p = T;
    q = new BiTnode;
    while(p || !emptystack(S))
    {
        if(p)
        {
            push(S,p);
            p = p -> lchild;
        }
        else{

            q = pop(S);
            cout << q -> data << ' ';
            p = q -> rchild;
        }
    }
}
int deepth(BiTtree &T)
{
    if(T == NULL)
        return 0;
    int m = deepth(T -> lchild);
    int n = deepth(T -> rchild);
    if(m > n)
    return m + 1;
    else
    return n + 1;
}
int nodenum(BiTtree &T)
{
    if(T == NULL)
        return 0;
    else
        return nodenum(T -> lchild) + nodenum(T -> rchild) + 1;
}
int main()
{
    BiTtree T;
    cout << "请输入前序的二叉树序列:(#代表空)" << endl;
    create(T);
    cout << "接下来是前序遍历二叉树:" << endl;
    preorder(T);
    cout << endl;
    cout << "接下来是中序遍历二叉树:" << endl;
    inorder(T);
    cout << endl;
    cout << "接下来是后序遍历二叉树:" << endl;
    postorder(T);
    cout << endl;
    cout << "接下来是中序非递归遍历二叉树:" << endl;
    stackinorder(T);
    cout << endl;
    cout << "接下来是二叉树的深度:"  << endl;
    cout << deepth(T) << endl;
    cout << "接下来是二叉树的节点个数:" << endl;
    cout << nodenum(T) << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值