zoukankan      html  css  js  c++  java
  • 数据结构 实验三  二叉树

    数据结构 实验三  二叉树

    二叉树的部分递归算法较多,很值得去仔细思考,并且最后我们可以自己实现一个用递归完成的二叉树结点赋值的问题(可以参考下面代码最后的 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("
    ************************ 二 叉 树 ************************
    
    ");
    
        printf("输入二叉树的先序序列字符,建立二叉链表。
    (注意:#1、默认结点的数据类型为int整型,只需输入数字作为结点数据
           #2、虚结点以示空指针的位置,虚结点用 ' 0 '表示)
    ");
        printf("
    请输入根结点的值: ");
        TElemType data_root;
        cin>>data_root;
        CreateBiTree(T, data_root);
        printf("
    ---------二叉树构造完毕!---------
    ");
        
        // 二叉树的遍历
        printf("
    先序遍历二叉树:
    ");
        PreOrderTraverse(T,PrintChar);
        printf("
    中序遍历二叉树:
    ");
        InOrderTraverse(T);
        printf("
    后序遍历二叉树:
    ");
        PostOrderTraverse(T);
        printf("
    
    ---------三种遍历完毕!---------
    
    ");
    
        printf("结点总数 : %d
    
    ", nodes(T));
    
        printf("叶子结点数 : %d
    
    ", leafs(T));
    
        printf("该二叉树的深度 : %d
    
    ", depth(T));
    
        printf("
    
    ----------------按任意键开始交换左右子树操作……----------------
    ");
        system("pause");
    
        swap(T);
        printf("交换二叉树的左右子树之后 :
    ");
    
        printf("
    重新先序遍历二叉树
    
    ");
        PreOrderTraverse(T,PrintChar);
        printf("
    遍历完毕!
    ");
    
        printf("
    
    ----------------按任意键开始进行结点赋值操作……----------------
    ");
        system("pause");
    
        ChangeValue(T);            /*进行结点赋值操作*/
    
        printf("
    重新先序遍历二叉树
    
    ");
        PreOrderTraverse(T, PrintChar);
        printf("
    
    遍历完毕!
    
    
    ");
    
        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

  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/uppercloud/p/DataStructure_BiTree.html
Copyright © 2011-2022 走看看