第五章 树和二叉树 —— 二叉树的基本操作

二叉树的基本操作

  • 编程实现二叉树的先序、中序、后序和层序遍历
  • 编程实现非递归中序遍历
  • 编程实现:求二叉树的高度和叶子结点个数

代码如下:

#include <iostream>

using namespace std;

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

typedef struct StackNode
{
    BiTree data;
    struct StackNode *next;
}StackNode,*LinkStack;

int idx = 0;
//创建二叉树
void CreateBiTree(BiTree &T,char *treeSeq)
{
    if(treeSeq[idx]=='#')
    {
        T=NULL;
        ++idx;
    }
    else
    {
        T=new BiTNode;
        T->data=treeSeq[idx++];
        CreateBiTree(T->lchild,treeSeq);	//递归创建左子树
        CreateBiTree(T->rchild,treeSeq);	//递归创建右子树
    }
}

//前序遍历
void PreOrderTraverse(BiTree T)
{
    if(T)
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

//中序遍历
void InOrderTraverse(BiTree T)
{
    if(T)
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }
}

//后序遍历
void PostOrderTraverse(BiTree T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }
}

//层序遍历
void LevelOrderTraverse(BiTree T)
{
    int i,j;
    BiTree p[100];
    i = j = 0;
    if (T)
        p[j++] = T;
    while(i<j)
    {
        cout<<p[i]->data;
        if (p[i]->lchild)
            p[j++] = p[i]->lchild;
        if (p[i]->rchild)
            p[j++] = p[i]->rchild;
        i++;
    }
}
//销毁二叉树
void DestroyBiTree(BiTree &T)
{
    if(T)
    {
        DestroyBiTree(T->lchild);
        DestroyBiTree(T->rchild);
        delete T;
    }
}

//求二叉树结点总数
int NodeCount(BiTree T)
{
    if(T == NULL )
        return 0;
    else
        return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

//求叶子结点的个数
int LeafCount(BiTree T)
{
    if(T==NULL) 	//如果是空树返回0
        return 0;
    if (T->lchild == NULL && T->rchild == NULL)
        return 1; //如果是叶子结点返回1
    else
        return LeafCount(T->lchild) + LeafCount(T->rchild);
}

//求二叉树的深度
int Depth(BiTree T)
{
    if (T==NULL)
        return 0;
    else
    {
        int m=Depth(T->lchild);
        int n=Depth(T->rchild);
        if (m>=n)
            return m+1;
        else
            return n+1;
    }
}

void Push(LinkStack &S,BiTree p)
{
    StackNode *q = new StackNode;
    q->data = p;
    q->next = S;
    S = q;
}

bool Pop(LinkStack &S,BiTree &p)
{
    if (S==NULL)
        return false;
    p = S->data;
    StackNode *q = S;
    S = S->next;
    delete q;
    return true;
}

//非递归中序遍历
void InOrderTraverse_NonRecursive ( BiTree T)
{
    LinkStack S = NULL;
    BiTree p=T;
    BiTree q;
    while ( p || S!=NULL )
    {
        if ( p)
        {
            Push( S, p );
            p=p->lchild ;//根指针进栈,遍历左子树
        }
        else
        {
            Pop( S, q ); // 退栈
            cout<<q->data;//访问根结点
            p=q->rchild;//遍历右子树
        }
    }
}

int main()
{
    char treeSeq[20]="ABC##DE#G##F###";
    BiTree T;
    CreateBiTree(T,treeSeq);
    cout<<"前序遍历:";
    PreOrderTraverse(T);
    cout<<endl;

    cout<<"中序遍历:";
    InOrderTraverse(T);
    cout<<endl;

    cout<<"非递归中序遍历:";
    InOrderTraverse_NonRecursive(T);
    cout<<endl;

    cout<<"后序遍历:";
    PostOrderTraverse(T);
    cout<<endl;

    cout<<"层序遍历:";
    LevelOrderTraverse(T);
    cout<<endl;

    cout<<"二叉树总结点个数为:"<<NodeCount(T)<<endl;
    cout<<"二叉树叶子结点个数为:"<<LeafCount(T)<<endl;
    cout<<"二叉树深度为:"<<Depth(T)<<endl;
    DestroyBiTree(T);
    return 0;
}

原创文章 85 获赞 46 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Deam_swan_goose/article/details/105499294
今日推荐