二叉树的基本操作

来源:互联网 发布:在职法律硕士 知乎 编辑:程序博客网 时间:2024/06/07 00:04
#include "stdio.h"
#include "malloc.h"


#define  MAXSIZE 20
//二叉树结点的结构体表示形式
typedef struct node
{
    char data;
    struct node *left,*right;
}BTree;


//栈的结构体表示形式
typedef struct stackelem
{
    BTree* a[MAXSIZE];
    int top;
}Stack;


//队列的结构体的表示形式
typedef struct queueelem
{
    BTree* b[MAXSIZE];
    int front,rear;
}Queue;


//先序遍历创建二叉树,利用递归的方法
BTree* Create()
{
    char ch;
    scanf("%c",&ch);
    getchar();
    if (ch=='#')
    {
        return NULL;
    }
    else
    {
        BTree* btree=(BTree*)malloc(sizeof(BTree));
        if (NULL==btree)
        {
            return NULL; 
        }
        //中序遍历和后序遍历与先序遍历 只是顺序的不同。 
        btree->data=ch;
        btree->left=Create();
        btree->right=Create();
        return btree;
    }
}
//前序遍历,递归的方法
void Preorder(BTree* bt)
{
    if (NULL!=bt)
    {
        printf("%c ",bt->data);
        Preorder(bt->left);
        Preorder(bt->right);
    }
}//当不满足if时函数递归结束 
//前序遍历的非递归实现
/*
思想:利用栈来实现,根节点进栈,之后栈非空,弹出,接着
根节点的右结点进栈,之后,左结点进栈,接着,弹出栈顶元素(输出)
此节点的右结点进栈,之后左结点进栈,弹出栈顶元素(输出)一直下去,知道栈为空、
 
*/ 
//求二叉树的高度,递归实现
int Height(BTree* bt)
{
    int depth1,depth2;
    if (NULL==bt)
    {
        return 0;
    }
    else
    {
        depth1=Height(bt->left);
        depth2=Height(bt->right);
        if (depth1>depth2)
        {
            return (depth1+1);
        }
        else
        {
            return (depth2+1);
            
        }
    }
    
}
//层次遍历二叉树,用队列来实现
void TraversalOfLevel(BTree* bt)
{
    Queue q;
    q.front=q.rear=0;
    if (bt!=NULL)
    {
        printf("%c ",bt->data);
    }
    q.b[q.front]=bt;
    q.rear=q.rear+1;
    while (q.front<q.rear)
    {
        bt=q.b[q.front];
        q.front=q.front+1;
        if (bt->left!=NULL)
        {
            printf("%c ",bt->left->data);
            q.b[q.rear]=bt->left;
            q.rear=q.rear+1;
        }
        if (bt->right!=NULL)
        {
            printf("%c ",bt->right->data);
            q.b[q.rear]=bt->right;
            q.rear=q.rear+1;
        }
    }
}
int main()
{
BTree* btr=Create();
    printf("前序遍历:递归和非递归实现:\n");
    Preorder(btr); 
    printf("\n二叉树的高度:%d\n",Height(btr));
    printf("层次遍历:\n");
    TraversalOfLevel(btr);
return 0;
}
0 0
原创粉丝点击