Swust OJ973: 统计利用先序遍历创建的二叉树叶结点的个数

题目简述

利用 先序递归遍历算法创建二叉树计算该二叉树叶结点的个数

输入

接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。

输出

输出对应的二叉树叶结点的个数。

样例输入复制

ABCD###EF##G###
A##B##
#A

样例输出复制

3
Step One:先序递归遍历算法创建二叉树
void CreateTree(BiTree *&tree)
 {
     char ch;
     cin>>ch;
     if(ch=='#')
         tree=NULL;
     else
     {
         tree=(BiTree*)malloc(sizeof(BiTree));
         tree->data=ch;
         CreateTree(tree->lchild);
         CreateTree(tree->rchild);
         
     }
 }

Step Two:二叉树的叶结点

叶子结点 :度为0的结点, 即没有子结点的结点.

即当某结点既没有左孩子也没有右孩子时,可知该结点为二叉树的叶结点

void LeafCount(BiTree *&tree)
{
    if(tree!=NULL)
    {
        if(tree->lchild==NULL&&tree->rchild==NULL)
//左右孩子结点为空时,该结点为叶子结点
            count++;
        if(tree->lchild!=NULL)
            LeafCount(tree->lchild);
//当左孩子结点不为空时,继续调用递归函数判断左孩子结点是否为叶子结点
        if(tree->rchild!=NULL)
            LeafCount(tree->rchild);
    }
}

完整代码:

#include<iostream>
#include<malloc.h>
int count=0;
using namespace std;
typedef struct node
{
    char data;
    struct node *lchild,*rchild;
 }BiTree;
 void CreateTree(BiTree *&tree)
 {
     char ch;
     cin>>ch;
     if(ch=='#')
         tree=NULL;
     else
     {
         tree=(BiTree*)malloc(sizeof(BiTree));
         tree->data=ch;
         CreateTree(tree->lchild);
         CreateTree(tree->rchild);
         
     }
 }
 
void LeafCount(BiTree *&tree)
{
    if(tree!=NULL)
    {
        if(tree->lchild==NULL&&tree->rchild==NULL)
            count++;
        if(tree->lchild!=NULL)
            LeafCount(tree->lchild);
        if(tree->rchild!=NULL)
            LeafCount(tree->rchild);
    }
}
 int main()
 {
     BiTree *tree;
     CreateTree(tree);
     LeafCount(tree);
     cout<<count;
     return 0;
 }

猜你喜欢

转载自www.cnblogs.com/army613bts/p/12684490.html
今日推荐