天天看点

数据结构与算法系列---二叉树

二叉树的代码实现及操作:

数据结构与算法系列---二叉树

#include  < malloc.h >

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

#define   OK     1

数据结构与算法系列---二叉树

#define   ERROR  0

数据结构与算法系列---二叉树

#define   OVERFLOW -2

数据结构与算法系列---二叉树

#define   TURE   1

数据结构与算法系列---二叉树

#define   FALSE  0

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

#define   QMAXSIZE  20

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

typedef  int  TElemType;

数据结构与算法系列---二叉树

typedef  struct  BiTNode

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    TElemType data;

数据结构与算法系列---二叉树

    int flag;

数据结构与算法系列---二叉树

    struct BiTNode *lchild,*rchild;

数据结构与算法系列---二叉树

} BiTNode, * BiTree;

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

// 创建一棵二叉树

数据结构与算法系列---二叉树

int  CreateTree(BiTree  & T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    int ch;

数据结构与算法系列---二叉树

    printf("input a char:");

数据结构与算法系列---二叉树

    scanf("%d",&ch);

数据结构与算法系列---二叉树

    if(ch==0)

数据结构与算法系列---二叉树

        T=NULL;

数据结构与算法系列---二叉树

    else

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        T=(BiTree)malloc(sizeof(BiTNode));

数据结构与算法系列---二叉树

        if(!T)

数据结构与算法系列---二叉树

            return ERROR;

数据结构与算法系列---二叉树

        T->data=ch;

数据结构与算法系列---二叉树

        CreateTree(T->lchild);

数据结构与算法系列---二叉树

        CreateTree(T->rchild);

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

    return OK;

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 创建二叉树的数组

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

int  TreeArray[ 15 ] = ... {1,2,3,0,0,4,5,0,6,0,0,7,0,0,0} ;

数据结构与算法系列---二叉树

// 计数

数据结构与算法系列---二叉树

int  counter = 0 ;

数据结构与算法系列---二叉树

// 由数组创建一棵二叉树

数据结构与算法系列---二叉树

BiTree DefaultCreate()

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    int ch=TreeArray[counter++];

数据结构与算法系列---二叉树

    BiTree root;

数据结构与算法系列---二叉树

    if(ch==0)

数据结构与算法系列---二叉树

        root=NULL;

数据结构与算法系列---二叉树

    else

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        root=(BiTree)malloc(sizeof(BiTNode));

数据结构与算法系列---二叉树

        if(!root)

数据结构与算法系列---二叉树

            return ERROR;

数据结构与算法系列---二叉树

        root->data=ch;

数据结构与算法系列---二叉树

        root->lchild=DefaultCreate();

数据结构与算法系列---二叉树

        root->rchild=DefaultCreate();

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

    return root;

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 创建一棵二叉树

数据结构与算法系列---二叉树

BiTree CreateBiTree()

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    int ch;

数据结构与算法系列---二叉树

    BiTree root;

数据结构与算法系列---二叉树

    printf("input a char:");

数据结构与算法系列---二叉树

    scanf("%d",&ch);

数据结构与算法系列---二叉树

    if(ch==0)

数据结构与算法系列---二叉树

        root=NULL;

数据结构与算法系列---二叉树

    else

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        root=(BiTree)malloc(sizeof(BiTNode));

数据结构与算法系列---二叉树

        if(!root)

数据结构与算法系列---二叉树

            return ERROR;

数据结构与算法系列---二叉树

        root->data=ch;

数据结构与算法系列---二叉树

        root->lchild=CreateBiTree();

数据结构与算法系列---二叉树

        root->rchild=CreateBiTree();

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

    return root;

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 先序遍历(递归算法)

数据结构与算法系列---二叉树

void  PreOrderTraverse(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    if(T!=NULL)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        printf("%d ,",T->data);

数据结构与算法系列---二叉树

        PreOrderTraverse(T->lchild);

数据结构与算法系列---二叉树

        PreOrderTraverse(T->rchild);

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 先序遍历(非递归算法)

数据结构与算法系列---二叉树

void  PreOrderTraverse2(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    BiTree Q[20];

数据结构与算法系列---二叉树

    BiTree p=T;

数据结构与算法系列---二叉树

    int top=-1;

数据结构与算法系列---二叉树

    while(p||top>-1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        while(p)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            printf("%d, ",p->data);

数据结构与算法系列---二叉树

            Q[++top]=p;

数据结构与算法系列---二叉树

            p=p->lchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

        if(top>-1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            p=Q[top--];

数据结构与算法系列---二叉树

            p=p->rchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 中序遍历二叉树(递归算法)

数据结构与算法系列---二叉树

void  InOrderTraverse(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    if(T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        InOrderTraverse(T->lchild);

数据结构与算法系列---二叉树

        printf("%d ,",T->data);

数据结构与算法系列---二叉树

        InOrderTraverse(T->rchild);

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 中序遍历(非递归算法)

数据结构与算法系列---二叉树

void  InOrderTraverse2(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    BiTree Q[20];

数据结构与算法系列---二叉树

    BiTree p=T;

数据结构与算法系列---二叉树

    int top=-1;

数据结构与算法系列---二叉树

    while(p||top>-1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        while(p)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            Q[++top]=p;

数据结构与算法系列---二叉树

            p=p->lchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

        if(top>-1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            p=Q[top--];

数据结构与算法系列---二叉树

            printf("%d, ",p->data);

数据结构与算法系列---二叉树

            p=p->rchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 后序遍历二叉树(递归算法)

数据结构与算法系列---二叉树

void  PostOrderTraverse(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    if(T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        PostOrderTraverse(T->lchild);

数据结构与算法系列---二叉树

        PostOrderTraverse(T->rchild);

数据结构与算法系列---二叉树

        printf("%d ,",T->data);

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 后序遍历(非递归算法)

数据结构与算法系列---二叉树

void  PostOrderTraverse2(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    int flag[20];

数据结构与算法系列---二叉树

    BiTree Q[20],p=T;

数据结构与算法系列---二叉树

    int top=-1;

数据结构与算法系列---二叉树

    while(p||top>-1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        while(p)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            Q[++top]=p;

数据结构与算法系列---二叉树

            flag[top]=0;

数据结构与算法系列---二叉树

            p=p->lchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

        if(top>-1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            if(flag[top]==0&&Q[top]->rchild)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

            ...{

数据结构与算法系列---二叉树

                flag[top]=1;

数据结构与算法系列---二叉树

                p=Q[top]->rchild;

数据结构与算法系列---二叉树

            }

数据结构与算法系列---二叉树

            else

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

            ...{

数据结构与算法系列---二叉树

                printf("%d, ",Q[top]->data);

数据结构与算法系列---二叉树

                top--;

数据结构与算法系列---二叉树

            }

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 广度优先遍历

数据结构与算法系列---二叉树

void  BFTraverse(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    BiTree Q[QMAXSIZE],p=T;

数据结构与算法系列---二叉树

    int front=0,rear=0;

数据结构与算法系列---二叉树

    Q[rear++]=p;

数据结构与算法系列---二叉树

    while(front!=rear)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        p=Q[front];

数据结构与算法系列---二叉树

        front=(front+1)%QMAXSIZE;

数据结构与算法系列---二叉树

        printf("%d, ",p->data);

数据结构与算法系列---二叉树

        if(p->lchild)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            Q[rear]=p->lchild;

数据结构与算法系列---二叉树

            rear=(rear+1)%QMAXSIZE;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

        if(p->rchild)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            Q[rear]=p->rchild;

数据结构与算法系列---二叉树

            rear=(rear+1)%QMAXSIZE;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

void  BiTLink_Ancestor2(BiTree T, int  x)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    BiTree stack[20];

数据结构与算法系列---二叉树

    BiTNode *q=T;

数据结构与算法系列---二叉树

    int top=-1,i;

数据结构与算法系列---二叉树

    while(1)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        while(q)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            ++top;

数据结构与算法系列---二叉树

            stack[top]=q;

数据结构与算法系列---二叉树

            stack[top]->flag=0;

数据结构与算法系列---二叉树

            q=q->lchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

        if(top==-1)

数据结构与算法系列---二叉树

            return;

数据结构与算法系列---二叉树

        if(stack[top]->flag==0&&stack[top]->rchild)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            stack[top]->flag=1;

数据结构与算法系列---二叉树

            q=stack[top]->rchild;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

        else

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

        ...{

数据结构与算法系列---二叉树

            if(stack[top]->data==x)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

            ...{

数据结构与算法系列---二叉树

                i=0;

数据结构与算法系列---二叉树

                while(i<top)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

                ...{

数据结构与算法系列---二叉树

                    printf("%d, ",stack[i]->data);

数据结构与算法系列---二叉树

                    i++;

数据结构与算法系列---二叉树

                }

数据结构与算法系列---二叉树

                return;

数据结构与算法系列---二叉树

            }

数据结构与算法系列---二叉树

            top--;

数据结构与算法系列---二叉树

        }

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

// 交换左右结点(递归算法)

数据结构与算法系列---二叉树

void  BiTree_ExchangeNode(BiTree T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    BiTNode *p;

数据结构与算法系列---二叉树

    if(T)

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    ...{

数据结构与算法系列---二叉树

        p=T->lchild;

数据结构与算法系列---二叉树

        T->lchild=T->rchild;

数据结构与算法系列---二叉树

        T->rchild=p;

数据结构与算法系列---二叉树

        BiTree_ExchangeNode(T->lchild);

数据结构与算法系列---二叉树

        BiTree_ExchangeNode(T->rchild);

数据结构与算法系列---二叉树

    }

数据结构与算法系列---二叉树

}

数据结构与算法系列---二叉树

int  main( int  argc, char   * argv[])

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

... {

数据结构与算法系列---二叉树

    BiTree root=NULL;

数据结构与算法系列---二叉树

//    CreateTree(root);

数据结构与算法系列---二叉树

//    root=CreateBiTree();

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    root=DefaultCreate();

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    printf("preorder is: ");

数据结构与算法系列---二叉树

    PreOrderTraverse(root);

数据结构与算法系列---二叉树

    PreOrderTraverse2(root);

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    printf("  inorder is: ");

数据结构与算法系列---二叉树

    InOrderTraverse(root);

数据结构与算法系列---二叉树

    InOrderTraverse2(root);

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树
数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    printf("  post order is: ");

数据结构与算法系列---二叉树

    PostOrderTraverse(root);

数据结构与算法系列---二叉树

    PostOrderTraverse2(root);

数据结构与算法系列---二叉树
数据结构与算法系列---二叉树
数据结构与算法系列---二叉树

    return OK;

数据结构与算法系列---二叉树

}  

继续阅读