#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; }
原文:https://www.cnblogs.com/petitepluie/p/14752853.html