#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; typedef struct BiTNode { char data; struct BiTNode *l; struct BiTNode *r; } BiTNode,*BiTree; void CreatBiTree(BiTree &T) { ///按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T; char ch; scanf("%c",&ch); if(ch=='#') T=NULL; else { T=new BiTNode; T->data=ch; CreatBiTree(T->l); CreatBiTree(T->r); } } void PreOrderTraverse(BiTree T)///先序遍历二叉树 { if(T) { printf("%c",T->data); PreOrderTraverse(T->l); PreOrderTraverse(T->r); } } void MidOrderTraverse(BiTree T)///中序遍历二叉树 { if(T) { MidOrderTraverse(T->l); printf("%c",T->data); MidOrderTraverse(T->r); } } void AfOrderTraverse(BiTree T)///后序遍历二叉树 { if(T) { AfOrderTraverse(T->l); AfOrderTraverse(T->r); printf("%c",T->data); } } int Count(BiTree T){ //计算叶子结点的数目(利用递归) if(T== NULL){ return 0; } else if ((T->l==NULL) && (T->r==NULL)){ return 1; } else{ return Count(T->l)+Count(T->r); } } int main() { BiTree T; CreatBiTree(T); printf("先序遍历为\n"); PreOrderTraverse(T); printf("\n"); printf("中序遍历为\n"); MidOrderTraverse(T); printf("\n"); printf("后序遍历为\n"); AfOrderTraverse(T); printf("\n"); printf("输出叶子结点数:%d\n",Count(T)); return 0; }
(首先用#号填充,使二叉树的叶子结点全部为#)
输入:AB#CD##E##F#GH###
输出见下图:
计算二叉树的所有叶子节点的数量:
当一个节点的左孩子和右孩子都为空时,它是叶子节点。
使用递归如果能找到就返回1,如果节点为NULL返回0,否则返回count(t->lchild)+ count(t->rchild)