二叉树的先序中序后序以及递归算法求高度和结点数目
2017-11-26 16:14
357 查看
#include "stdio.h" //定义结点 typedef struct Node { char data; struct Node * LChild; struct Node * RChild; }BiTNode,*BiTree; //创建树 void CreateBiTree(BiTree * bt) { char ch; ch = getchar(); if(ch=='.') *bt=NULL; else { *bt=(BiTree)malloc(sizeof(BiTNode)); (*bt)->data=ch; CreateBiTree(&((*bt)->LChild)); CreateBiTree(&((*bt)->RChild)); } } //先序遍历二叉树 void PreOrder(BiTree root) { if(root!=NULL) { printf("%c ",root->data);//访问根结点 PreOrder(root->LChild);//先序遍历左子树 PreOrder(root->RChild);//先序遍历右子树 } } //中序遍历二叉树 void InOrder(BiTree root) { if(root!=NULL) { InOrder(root->LChild);//中序遍历左子树 printf("%c ",root->data);//访问根结点 InOrder(root->RChild);//中序遍历右子树 } } //后序遍历二叉树 void PostOrder(BiTree root) { if(root!=NULL) { PostOrder(root->LChild);//后序遍历左子树 PostOrder(root->RChild);//后序遍历右子树 printf("%c ",root->data);//访问根结点 } } //先序遍历输出二叉树的结点 void PreOrder1(BiTree root) //先序遍历输出二叉树的结点,为指向二叉树根结点的指针 { if(root!=NULL) { printf("%c ",root->data);//输出根结点 PreOrder1(root->LChild);//先序遍历左子树 PreOrder1(root->RChild);//先序遍历右子树 } } //后序遍历统计二叉树的结点的个数 int leaf(BiTree root) { int LeafCount; if(root==NULL) LeafCount=0; else if((root->LChild==NULL)&&(root->RChild==NULL)) LeafCount=1; else //叶子数为左右子树的叶子数目之和 LeafCount=leaf(root->LChild)+leaf(root->RChild); return LeafCount; } //后序遍历求二叉树高度的递归算法 int PostTreeDepth(BiTree bt) //后序遍历求二叉树bt高度的递归算法 { int hl,hr,max; if(bt!=NULL) { hl=PostTreeDepth(bt->LChild);//求左子树的深度 hr=PostTreeDepth(bt->RChild);//求右子树的深度 max=hl>hr?hl:hr;//得到左右子树深度较大的 return (max+1);//返回树的深度 } else return 0;//如果是空树,则返回0 } //主函数输出 int main() { printf("请输入二叉树:\n"); BiTree root; CreateBiTree(&root); printf("先序遍历:\n");//输出先序遍历的结果 PreOrder(root); printf("\n中序遍历:\n");//输出中序遍历的结果 InOrder(root); printf("\n后序遍历:\n");//输出后序遍历的结果 PostOrder(root); printf("\n输出叶子结点:\n");//输出叶子结点 PreOrder1(root); leaf(root); printf("\n输出叶子结点数目:\n%d",leaf(root));//输出叶子结点的数目 PostTreeDepth(root); printf("\n输出二叉树的高度:\n%d",PostTreeDepth(root));//输出二叉树的高度 } //下面是二叉树的输入 /*ABDE..F...CGI...HJ..K.L..*/
相关文章推荐
- 二叉树的中序、前序、后序以及层序的非递归遍历并求树的深度和结点总数
- 【数据结构作业四】以二叉链表作存储结构,建立一棵二叉树,并输出该二叉树的先序、中序、后序遍历序列、高度和其叶子结点数。
- 二叉树中递归算法的两个应用——数(非)叶子结点的数目和判断是否是排序二叉树
- 二叉树的建树,按层遍历,结点总数,页结点,深度以及三序非递归遍历二叉树,建立中序线索二叉树
- 二叉树的先序中序后序递归非递归遍历,插入删除等操作
- (1)建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。 (3)写出对用二叉链表存储的二叉树进行层次遍历算法。 (4)求二叉树的所有叶子及结点总数。
- 先序遍历二叉树的递归算法怎样理解
- 先序遍历二叉树的递归算法怎样理解
- 二叉树的建立以及前序、中序、后序遍历的递归和非递归实现
- 计算二叉树的高度和结点数
- 【数据结构】二叉树结点插入和前序、中序、后序遍历的递归实现
- 根据先序中序求后序的递归算法
- 二叉树的查找、二叉树高度、二叉树获得双亲结点、构造二叉树、二叉树的广义表表示法、二叉树的插入删除、二叉树的非递归实现
- Java二叉树(一)--定义及前序、中序、后序、层次遍历及求高度的实现
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作
- 二叉排序树的创建,删除结点;树的前序,中序,后序非递归遍;二叉树的线索化
- 二叉树的前序,中序,后序的递归与非递归遍历以及按层遍历
- JAVA实现二叉树的遍历的非递归算法及递归算法(前序,中序,后序,层次)
- 二叉树的创建以及前序、中序、后序遍历