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

本次实验的内容有:

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

本来写的是顺序栈,后来看栈中存的是指针,就改成链栈了。
另外在创建二叉树的时候,用#代表空位置。
接下里是运行图片:
数据结构之二叉树的基本操作_第1张图片

代码

#include 
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;
}

你可能感兴趣的:(数据结构)