首页 > 编程语言 > 详细

二叉树二叉链表的构建遍历等操作(C语言)

时间:2021-05-10 22:42:17      阅读:17      评论:0      收藏:0      [点我收藏+]
#include <stdio.h>
#include <stdlib.h>

/**
* 二叉树的链式存储——二叉链表 
*/

#define OK 1;
const int OVERFLOW = -2;

typedef int Status;
typedef char TElemType;
//二叉链表结构定义 
typedef struct BiNode{
    TElemType data;
    struct BiNode *lchild, *rchild;
} BiNode, *BiTree;


//由字符序列创建二叉树
Status CreateBiTree(BiTree *tree,TElemType data[],int *j,int len){
    if((*j)<=len-1){
        if(data[(*j)]==#){
            (*tree)=NULL;
            (*j)++;
        } else {
            (*tree)=(BiTree)malloc(sizeof(BiNode));
            if(!(*tree)) return OVERFLOW;
            (*tree)->data=data[(*j)];  //生成根结点 
            (*j)++;
            CreateBiTree(&((*tree)->lchild),data,j,len);  //构造左子树 
            CreateBiTree(&((*tree)->rchild),data,j,len);  //构造右子树
        }
    }
    return OK;
}

//二叉树的先序遍历(交换 Visit函数 和 遍历左右子树函数 的位置即得到中序遍历和后序遍历) 
Status PreOrderTraverse(BiTree tree){
    if(tree==NULL) return OK;  //空二叉树 
    Visit(tree);
    PreOrderTraverse(tree->lchild);  //递归遍历左子树 
    PreOrderTraverse(tree->rchild);  //递归遍历右子树 
} 
Status Visit(BiTree tree){
    printf("%c",tree->data);
    return OK;
}

//按先序遍历方式复制二叉树
void Copy(BiTree tree,BiTree *newTree){
    if(tree==NULL){
        (*newTree)=NULL;
    } else {
        //复制根结点 
        (*newTree)=(BiTree)malloc(sizeof(BiTree));
        (*newTree)->data=tree->data;
        //递归复制左右子树 
        Copy(tree->lchild,&((*newTree)->lchild));
        Copy(tree->rchild,&((*newTree)->rchild));
    }
} 


//计算二叉树深度
int Depth(BiTree tree){
    if(tree==NULL){
        return 0;
    } else {
        int lchildDepth=Depth(tree->lchild);
        int rchildDepth=Depth(tree->rchild);
        if(lchildDepth>rchildDepth){
            return lchildDepth+1;
        } else {
            return rchildDepth+1;
        }
    }
} 

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

//计算二叉树叶子结点数
int LeafCount(BiTree tree){
    if(tree==NULL){
        return 0;
    } else if(tree->lchild==NULL&&tree->rchild==NULL) {
        return 1;
    } else {
        return LeafCount(tree->lchild)+LeafCount(tree->rchild);
    }
} 

int main(void) {
    //待创建二叉树的结构
    /*
                A
              /
            B
          /          C      D
            /             E    F
                         G
    */ 
    
    //指向二叉树的指针 
    BiTree bitree1;
    
    //创建二叉树 待用数据 
    TElemType data1[]={A,B,C,#,#,D,E,#,G,#,#,F,#,#,#,};  //先序遍历序列 
    int len1=sizeof(data1)/sizeof(data1[0]);
    int* j1=(int*)malloc(sizeof(int));
    *j1=0;
    
    //按先序遍历序列创建二叉树 
    Status createBiTreeResult = CreateBiTree(&bitree1,data1,j1,len1);
    printf("二叉树创建结果:%d\n",createBiTreeResult);
    
    //测试 
    printf("\n手动测试");
    printf("\nA:%c\n",bitree1->data);  //A
    printf("B:%c\n",bitree1->lchild->data);  //B
    printf("C:%c\n",bitree1->lchild->lchild->data);  //C
    printf("D:%c\n",bitree1->lchild->rchild->data);  //D
    printf("E:%c\n",bitree1->lchild->rchild->lchild->data);  //E
    printf("G:%c\n",bitree1->lchild->rchild->lchild->rchild->data);  //G
    printf("F:%c\n",bitree1->lchild->rchild->rchild->data);  //F
    printf("手动测试结束\n\n");
    
    //先序遍历二叉树 
    Status preOrderTraverseResult = PreOrderTraverse(bitree1);
    printf("\n二叉树先序遍历结果:%d\n",preOrderTraverseResult);
    
    //复制二叉树
    printf("\n二叉树复制:\n");
    BiTree bitree2;  //将树bitree1复制到树bitree2 
    Copy(bitree1,&bitree2);
    PreOrderTraverse(bitree2);
    
    int depth = Depth(bitree2);
    printf("\n\n树深:%d\n",depth);
    
    int nodeCount = NodeCount(bitree2);
    printf("\n结点总数:%d\n",nodeCount);
    
    int leafCount = LeafCount(bitree2);
    printf("\n叶子结点数:%d\n",leafCount);
    
    printf("\nEND");
    return 0;
}

技术分享图片

二叉树二叉链表的构建遍历等操作(C语言)

原文:https://www.cnblogs.com/petitepluie/p/14752853.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!