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

题目简述

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

输入

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

输出

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

样例输入复制

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

样例输出复制

3Step 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;
 }

原文地址:https://www.cnblogs.com/army613bts/p/12684490.html

时间: 2024-08-29 11:17:21

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

Swust OJ975: 统计利用先序遍历创建的二叉树的度为2的结点个数

题目简述 利用先序递归遍历算法创建二叉树并计算该二叉树度为2结点的个数 输入 接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树). 输出 输出该用例对应的二叉树度为2的结点个数. 样例输入复制 ABCD###EF##G##H## 样例输出复制 3知识点:二叉树每个结点至多只有两棵子树,即二叉树中不存在大于2的结点故所求二叉树度为2的结点,即既有左孩子也要有右孩子 void DegreeTwo(Tree *&tree) { if(tree!=NULL

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出 样例输入 A B # D # # C E # # F # # 样例输出 LevelOrder: A B C D E F 代码: #include <iostream> #include <queue> using namespace std; struct node { //表示一个树上的节点 char ch; node *left, *right; }; node* creat() { //以递归的方式构造一棵二叉树 node *root =

二叉树 根据二叉树的前序数组和中序序遍历数组生成二叉树

题目:给定二叉树的前序遍历和中序遍历,生成二叉树. Example: 前序遍历数组:preArr[]:{1,2,4,5,3,6,7} 中序遍历数组:inArr[]:{4,2,5,1,6,3,7} 生成的二叉树如下图: 解题思路: 由二叉树的前序变量性质可知:preArr[0] 是数组的根节点,有根据二叉树的中序遍历的性质可知,{4,2,5}是二叉树的左子树,{6,3,7}在右子树上,重复执行该操作就构造出了二叉树 public class Solution { public TreeNode r

通过二叉树的中序和后序遍历序列构造二叉树(非递归)

题目:通过二叉树的中序和后序遍历序列构造二叉树 同样,使用分治法来实现是完全可以的,可是在LeetCode中运行这种方法的代码,总是会报错: Memory Limit Exceeded ,所以这里还是用栈来实现二叉树的构建. 与用先序和后序遍历构造二叉树的方法类似,但还是要做一些改变: 如果从后往前处理中序和后序的序列,则处理就为如下所示的情况: Reverse_Post: 根-右子树-左子树 Reverse_In: 右子树-根-左子树 这样处理方式和先序-中序就差不多了,只是将添加左孩子的情况

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

根据中序遍历和后序遍历树构造二叉树

样例: 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1   3 借鉴上一篇<前序遍历和中序遍历树构造二叉树>,我们知道中序遍历为左->中->右,后序遍历为左->右->中.于是后序遍历的最后一个值即为根节点的值,根据这个值我们在中序遍历中找到根节点左子树和右子树的值,递归构造左子树和右子树即可. /** * Definition of TreeNode: * class TreeNode { * public: * in

LintCode(72)中序遍历和后序遍历树构造二叉树

题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1    3 分析 递归解决. Python代码 """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None "&q

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回

题目:给定一个二叉树其中的一个结点(此节点可以为二叉树任意一个节点),请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 此二叉树的中序遍历为:8.4.9.2.10.5.1.6.3.7 思路: (1)如果此结点有右结点:返回 此结点的右结点 的最左的结点(例如4.2) (2)如果此结点没有右结点:(1)此结点为根节点:返回None  (2)此结点为上一个结点的左节点:返回上一个结点(例如结点6.8)  (3)此结点为上一个结点的右节点:(1)此