数据结构 实验三  二叉树

数据结构 实验三  二叉树

 

二叉树的部分递归算法较多,很值得去仔细思考,并且最后我们可以自己实现一个用递归完成的二叉树结点赋值的问题(可以参考下面代码最后的 ChangeValue 函数)。

 

同样,放出二叉树的实验代码:

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "Datahead.h"

using namespace std;

/*二叉树的链式存储表示*/
typedef int TElemType;                            /*由用户定义的实际数据类型*/

typedef struct BiTNode
{   
    TElemType data;
    struct BiTNode *lchild, *rchild;            /*左右孩子指针*/
} BiTNode, *BiTree;                                /*结点类型*/

int a;
void main()
{
    void CreateBiTree(BiTNode *&T, TElemType data);            /*构造二叉链表*/
    Status PrintChar(TElemType e);                            /*Visit 函数*/

    Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e));        /*前序遍历二叉树*/
    void InOrderTraverse(BiTree T);                                        /*中序遍历二叉树*/
    void PostOrderTraverse(BiTree T);                                    /*后序遍历二叉树*/
    int nodes(BiTree T);                                                /*计算总结点数*/
    int leafs(BiTree T);                                                /*计算总叶子数*/
    void swap(BiTree T);                                                /*交换左右子树*/
    int depth(BiTree T);                                                /*计算二叉树的深度*/
    void ChangeValue(BiTree T);                                            /*结点赋值*/

    BiTree T;
    
    printf("\n************************ 二 叉 树 ************************\n\n");

    printf("输入二叉树的先序序列字符,建立二叉链表。\n(注意:#1、默认结点的数据类型为int整型,只需输入数字作为结点数据\n       #2、虚结点以示空指针的位置,虚结点用 ' 0 '表示)\n");
    printf("\n请输入根结点的值: ");
    TElemType data_root;
    cin>>data_root;
    CreateBiTree(T, data_root);
    printf("\n---------二叉树构造完毕!---------\n");
    
    // 二叉树的遍历
    printf("\n先序遍历二叉树:\n");
    PreOrderTraverse(T,PrintChar);
    printf("\n中序遍历二叉树:\n");
    InOrderTraverse(T);
    printf("\n后序遍历二叉树:\n");
    PostOrderTraverse(T);
    printf("\n\n---------三种遍历完毕!---------\n\n");

    printf("结点总数 : %d\n\n", nodes(T));

    printf("叶子结点数 : %d\n\n", leafs(T));

    printf("该二叉树的深度 : %d\n\n", depth(T));

    printf("\n\n----------------按任意键开始交换左右子树操作……----------------\n");
    system("pause");

    swap(T);
    printf("交换二叉树的左右子树之后 :\n");

    printf("\n重新先序遍历二叉树\n\n");
    PreOrderTraverse(T,PrintChar);
    printf("\n遍历完毕!\n");

    printf("\n\n----------------按任意键开始进行结点赋值操作……----------------\n");
    system("pause");

    ChangeValue(T);            /*进行结点赋值操作*/

    printf("\n重新先序遍历二叉树\n\n");
    PreOrderTraverse(T, PrintChar);
    printf("\n\n遍历完毕!\n\n\n");

    system("pause");
}

/*构造二叉链表*/
void CreateBiTree(BiTNode *&T, TElemType data)       /* P131 算法6.4*/  // 此处改写了一些书上的代码
{   
    if(data == 0)        T = NULL;
    else
    {
        TElemType data_left, data_right;
        if( !( T = (BiTNode*)malloc(sizeof(BiTNode)) ) )     exit(0);
        T->data = data;
        cout<<"请输入<"<<T->data<<">的左子结点的值:";
        scanf("%d", &data_left);
        CreateBiTree(T->lchild, data_left);
        cout<<"请输入<"<<T->data<<">的右子结点的值:";
        scanf("%d", &data_right);
        CreateBiTree(T->rchild, data_right);
    }
}

Status PrintChar(TElemType e) {   /*Visit 函数*/
    printf("%d  ", e);
    return OK;
}

/*前序遍历二叉树*/
Status PreOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){  /* P129 算法6.1*/
    if(T){
      if(Visit(T->data))
         if(PreOrderTraverse(T->lchild, Visit))
           if(PreOrderTraverse(T->rchild, Visit)) return OK;
      return ERROR;
    } else return OK;
}

/*中序遍历二叉树的简单写法 */
void InOrderTraverse(BiTree T)
{    
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("%d  ",T->data);
        InOrderTraverse(T->rchild);
    }
}

/*后序遍历二叉树*/
void PostOrderTraverse(BiTree T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%d  ", T->data);
    }
}

/*计算总结点数*/
int nodes(BiTree T)
{   
   if(T)
     return( nodes(T->lchild) + nodes(T->rchild) + 1 );
   else
     return(0);

}

/*计算总叶子数*/
int leafs(BiTree T)
{ 
    if(T == NULL)    return(0);
    else {
        if( T->lchild == NULL && T->rchild == NULL )    return(1);
        else return( leafs(T->lchild) + leafs(T->rchild) );
    }
}

/*交换左右子树*/
void swap(BiTree T)
{ 
    BiTree p;
    if(T){
        p = T->lchild;
        T->lchild = T->rchild;
        T->rchild = p;
        swap(T->lchild);
        swap(T->rchild);
    }
}

 /*计算二叉树的深度或者称为高度*/
int depth(BiTree T) {
    int hl, hr, max;
    if(T) {
        if ( T->lchild == NULL && T->rchild == NULL )    return 1;
        else {
            hl = depth(T->lchild);
            hr = depth(T->rchild);
            max = (hl > hr) ? hl : hr;
            return   max + 1;
        }
    }
    else return 0;
}

/*结点赋值
     叶结点的值为3
     只有左孩子或右孩子的结点则其值分别等于左孩子或右孩子的值
     左、右孩子均有的结点,则其值等于左、右孩子结点的值之和
*/
void ChangeValue(BiTree T)
{
    if(T)
    {
        if( T->lchild == NULL && T->rchild == NULL )    T->data = 3;
        else
        {
            if( T->lchild != NULL && T->rchild != NULL )    T->data = T->lchild->data + T->rchild->data;    
            else
            {
                T->data = (T->lchild != NULL) ? T->lchild->data : T->rchild->data;
            }
        }
        ChangeValue(T->lchild);
        ChangeValue(T->rchild);
    }
}

可以直接复制上述代码,也可也去我的网盘下载该cpp源文件(含”DataHead.h“头文件)

http://pan.baidu.com/s/19X0B3

 

 

posted @ 2013-11-14 00:49  云端之上  阅读(637)  评论(0编辑  收藏  举报