您的位置:首页 > 其它

二叉树叶子节点及深度

2017-04-13 15:35 761 查看
#include "stdio.h"

#include <iostream>

#include <queue>

#include <stack>

#include "malloc.h"

#include "math.h"

#define OK 1

#define error 0

#define fuyi -1

//#define OVERFLOW -2

#define maxqsize 100 // 最大队列长度(对于循环队列,最大队列长度要减1)

#define stacksize2 100 // 存储空间初始分配量

#define stackadd 10 // 存储空间分配增量

//typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

//typedef int ElemType;

using namespace std;

typedef struct BiTNode{

    int  data;

    struct BiTNode *lchild,*rchild;//左右孩子指针

} BiTNode,*BiTree;

int create(BiTree &T, int n)

{

    int i, e, loop=1;

    BiTree s1, s2;

    for (i = 1; i <= n; i++){

        loop = 1;

        scanf("%d",&e);

        if (!(s1 = (BiTNode*)malloc(sizeof (BiTNode))))//分配

            return error;

        s1->data = e; s1->lchild = NULL; s1->rchild = NULL;//设置左右子树为空

        s2 = T;

        if (s2 == NULL){//第一次进入

            T = s1;

        }

        else

        while(loop){//构建排序二叉树

            if (s1->data< s2->data){//小于现在节点,进入左子树

                if (s2->lchild==NULL){

                    s2->lchild = s1;//左子树为空,则定位;

                    loop = 0;

                }

                else

                    s2 = s2 ->lchild;//左子树不为空,则继续比较

            }

            else if (s2->rchild == NULL){//大于等于现节点,进入右子树,右子树为空,则定位

                s2->rchild = s1;

                loop = 0;

            }

            else

                s2 = s2->rchild;//不为空,继续比较;

        }

    }

    return OK;

}

int Insert(BiTree T)

{

    BiTree S1, S2;

    int e;

    scanf("%d",&e);

    if(!(S2 = (BiTNode *)malloc(sizeof(BiTNode))))

        return error;

    S2->data = e;

    S2->lchild = NULL;

    S2->rchild = NULL;

    S1 = T;

    while (T){

        if (S1->data<=S2->data)

            if(!S1 -> rchild)

                {S1 -> rchild = S2;return OK;}

            else S1 = S1->rchild;

        else

        if(!S1 -> lchild)

        {S1 -> lchild = S2;return OK;}

        else S1 = S1->lchild;

    }

    T = S2;

    return OK;

}

int Search(BiTree T, int e)

{

    BiTree S;

    S = T;

    while(S){

        if (S->data < e){

            S = S->rchild;

        }

        else if (S->data >e){

            S = S->lchild;

        }

        else return OK;

    }

    return error;

}

int Visit(int e)

{

    printf("%d ",e);

    return OK;

}

int pre( BiTree T, int(*Visit)(int) ) {

        if(T)

        {

        if(Visit(T->data))

            if(pre(T->lchild , Visit))

                if(pre(T->rchild , Visit))

                    return OK;

        return error;

        }

        else return OK;

}

int in( BiTree T, int(*Visit)(int) ) {

    if(T)

    {

        if(in(T->lchild , Visit))

            if(Visit(T->data))

                if(in(T->rchild , Visit))

                    return OK;

        return error;

    }

    else return OK;

}

int post( BiTree T, int(*Visit)(int) ) {

    if(T)

    {if(post(T->lchild , Visit))

        if(post(T->rchild , Visit))

            if(Visit(T->data))

                return OK;

                return error;

    }

    else return OK;

}

int pre2( BiTree T, int(*Visit)(int) ) {

        if(T)

        {

        if(Visit(T->data))

            if(pre2(T->rchild , Visit))

                if(pre2(T->lchild , Visit))

                    return OK;

        return error;

        }

        else return OK;

}

int in2( BiTree T, int(*Visit)(int) ) {

    if(T)

    {

        if(in2(T->rchild , Visit))

            if(Visit(T->data))

                if(in2(T->lchild , Visit))

                    return OK;

        return error;

    }

    else return OK;

}

int post2( BiTree T, int(*Visit)(int) ) {

    if(T)

    {if(post2(T->rchild , Visit))

        if(post2(T->lchild , Visit))

            if(Visit(T->data))

                return OK;

                return error;

    }

    else return OK;

}

int NewInOrder(BiTree T)

{

    BiTree S1;

    stack<BiTree> s;

    S1 = T;

    while (S1||!s.empty()){

        while (S1!=NULL){//如果不为空,一直往左子树走;

            s.push(S1);

            S1 = S1->lchild;

        }

        if (!s.empty()){

             S1 = s.top();

            s.pop();

            cout<<S1->data<<" ";

            S1 = S1->rchild;

        }

    }

    return OK;

}

int Level(BiTree T)

{

    BiTree S1;

    S1 = T;

    queue<BiTree> q;

    q.push(S1);

    while(!q.empty()){

        cout << q.front()->data << " ";//遍历对头节点

        if (q.front()->lchild != NULL)//如果对头节点有左孩子,将左孩子入队

            q.push(q.front()->lchild);

        if (q.front()->rchild != NULL)//如果对头节点有右孩子,将右孩子入队

            q.push(q.front()->rchild);

        q.pop();//将已经遍历过的节点出队

    }

    return OK;

}

int depth(BiTNode *T)

{

    int left = 0;

    int right = 0;

    int deep = 0;

    if (T == NULL){

        return deep;

    }

    left = depth(T->lchild);

    right = depth(T->rchild);

    deep = left>right?left:right;

    deep++;

    return deep;

}

int leave(BiTree T)

{

    static int num=0;

    if(T==NULL)

    {

        return num;

    }

    if(T->lchild==NULL&&T->rchild==NULL)

    {

        num++;

    }

   leave(T->lchild);

   leave(T->rchild);

    return num;

}

int main() //主函数

{

    BiTree T=NULL;

    int n;

    int e;

    scanf("%d", &n);

    if(!create(T,n))

        return error;

    pre( T, Visit );

    printf("\n");

    in( T, Visit);

    printf("\n");

    post( T, Visit );

    printf("\n");

    scanf("%d",&e);

    printf("%d\n",Search(T,e));

    scanf("%d",&e);

    printf("%d\n",Search(T,e));

    Insert(T);

    pre( T, Visit );

    printf("\n");

    in( T, Visit);

    printf("\n");

    post( T, Visit );

    printf("\n");

    NewInOrder( T );

    printf("\n");

    Level( T );

    printf("\n");

    pre2( T, Visit );

    printf("\n");

    in2( T, Visit);

    printf("\n");

    post2( T, Visit );

    printf("\n");

    pre( T, Visit );

    printf("\n");

    in( T, Visit);

    printf("\n");

    post( T, Visit );

    printf("\n");

    printf("%d\n",depth(T));

    printf("%d\n",leave(T));

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐