二叉树的创建,先中后序输出,计算叶子结点数目

#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)

原文地址:https://www.cnblogs.com/diandianer/p/9959959.html

时间: 2024-10-29 10:38:55

二叉树的创建,先中后序输出,计算叶子结点数目的相关文章

二叉树非递归先中后序遍历 及 非递归交换二叉树两个孩子的位置

看到一个非递归交换一个二叉树的左右孩子的位置,于是想实现之,才发现非递归的先中后序遍历都忘记了……于是杂七杂八的写了一些,抄抄资料就实现了,然后实现非递归交换两个孩子的位置还是相当容易的.先直接上代码吧,其实这东西还是得自己写写过一遍的,印象才会更加深刻: #include <iostream> #include <fstream> #include <string> #include <stack> using std::cout; using std::

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是

非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

002.深入浅出理解[二叉树的构建、先中后序遍历、树的深度、左右子树互换]

二叉树本来就是递归定义的,如果对递归还不是特别了解,建议看一下<001.深入浅出解释[递归]> 写一个递归函数很简单,只需要记住下面2点: 1.递归中止条件:对于二叉树来说一般是node==null的时候判断到了叶子结点 2.递归函数::描述一个中间过程,然后用代码实现,调用自身的时候传递的参数就是你想要递归的方式. 下面的代码就是一个二叉树的创建.先中后序遍历.树的深度.左右子树的互换的过程 #include <stdio.h> // 定义二叉树的结点 struct treeNo

二叉树的建立及其前中后序遍历

1 //二叉树存储结构: 2 struct node 3 { 4 Int data; 5 node *lchild; 6 node *rchild; 7 }; 8 9 //二叉树在建树前根节点不存在: 10 Node *root = NULL; 11 12 //新建结点: 13 node *newNode(int v) 14 { 15 node *Node = new node; 16 Node->data = v; 17 Node->lchild = NULL; 18 Node->rc

栈实现二叉树的先,中,后序遍历

栈实现二叉树先,中,后序遍历 如果是使用递归来实现二叉树的先,中,后序遍历只需要更改三行代码的位置,但若是使用栈来写那便会有趣得多 根结点与其左右子树间的输出优先级 graph TD 1((根结点))---2((左子树)) 1---3((右子树)) 遍历方式 输出优先级 先序 根结点>左子树>右子树 中序 左子树>根结点>右子树 后序 左子树>右子树>根节点 使用栈的规则 栈内元素是指向结点的指针 只有栈顶元素指向的结点内容才会被输出 方便,不用记忆太多结点 结点内容输

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v