zoukankan      html  css  js  c++  java
  • 基础数据结构-二叉树-计算二叉树的叶子结点数

    计算一颗二叉树包含的叶子结点数量。
    提示:叶子是指它的左右孩子为空。

    建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
    输入

    第一行输入一个整数t,表示有t个测试数据

    第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行

    输出

    逐行输出每个二叉树的包含的叶子数量

    样例输入

    3
    AB0C00D00
    AB00C00
    ABC00D00E00
    样例输出

    2
    2
    3

    #include<iostream>
    #include<string>
    using namespace std;
    
    class BiTreeNode
    {
    public:
        char data;        //结点数据
        BiTreeNode *LeftChild;    //左子树指针
        BiTreeNode *RightChild;        //右子树指针
        BiTreeNode():LeftChild(NULL),RightChild(NULL){}
        ~BiTreeNode(){}
    };
    
    class BiTree
    {
    private:
        BiTreeNode *Root;    //根结点指针
        int pos;
        string strTree;
        BiTreeNode *CreateBiTree();
        void PreOrder(BiTreeNode *t);
        void InOrder(BiTreeNode *t);
        void PostOrder(BiTreeNode *t);
    public:
        BiTree(){};
        ~BiTree(){};
        void CreateTree(string TreeArray);
        void PreOrder();
        void InOrder();
        void PostOrder();
    };
    
    //构造二叉树,利用先序遍历结果建树
    void BiTree::CreateTree(string TreeArray)    //公有函数,对外接口
    {
        pos = 0;
        strTree.assign(TreeArray);
        Root = CreateBiTree();
    }
    
    BiTreeNode *BiTree::CreateBiTree()    //递归建树,私有函数,类内实现
    {
        BiTreeNode *T;
        char ch;
        ch=strTree[pos++];
        if(ch=='0')
            T = NULL;
        else
        {
            T = new BiTreeNode();
            T->data = ch;        //生成根结点
            T->LeftChild = CreateBiTree();    //构造左子树
            T->RightChild = CreateBiTree();    //构造右子树
        }
        return T;
    }
    
    //定义先序遍历函数
    void BiTree::PreOrder()    //公有函数,对外接口
    {
        PreOrder(Root);
    }
    
    void BiTree::PreOrder(BiTreeNode *t)    //私有函数,类内实现
    {
        if(t!=NULL)
        {
            cout << t->data;    //输出当前结点t的数据,表示t已经访问
            PreOrder(t->LeftChild);    //先序遍历t的左孩子
            PreOrder(t->RightChild);    //先序遍历t的右孩子
        }
    }
    
    //定义中序遍历函数
    void BiTree::InOrder()    //公有函数,对外接口
    {
        InOrder(Root);
    }
    
    void BiTree::InOrder(BiTreeNode *t)    //私有函数,类内实现
    {
        if(t)
        {
            InOrder(t->LeftChild);    //中序遍历t的左孩子
            cout << t->data;        //输出当前结点t的数据,表示t已经访问
            InOrder(t->RightChild);    //中序遍历t的右孩子
        }
    }
    
    //后序遍历函数
    void BiTree::PostOrder()    //公有函数,对外接口
    {
        PostOrder(Root);
    }
    
    void BiTree::PostOrder(BiTreeNode *t)    //私有函数,类内实现
    {
        if(t)
        {
            PostOrder(t->LeftChild);    //后序遍历t的左孩子
            PostOrder(t->RightChild);    //后序遍历t的右孩子
            cout << t->data;        //输出当前结点t的数据,表示t已经访问
        }
    }
    
    int main(void)
    {
        int t;
        BiTree T;
        string str;
        cin >> t;
        for(int i=0;i<t;i++)
        {
            cin >> str;
            T.CreateTree(str);
            T.PreOrder();
            cout << endl;
            T.InOrder();
            cout << endl;
            T.PostOrder();
            cout << endl;
        }
        return 0;
    }
  • 相关阅读:
    C++程序设计入门--前言
    C++ string_view 的坑
    从OGRE,GAMEPLAY3D,COCOS2D-X看开源
    抽烟解闷的程序员
    一个团队应该是什么样
    准备开始接手公司的项目
    两位印象深刻的同事
    一段故事结束,一段生活开始
    starling性能优化总结(毫无疑问还是转载)
    知道端口号如何查看应用位置
  • 原文地址:https://www.cnblogs.com/nathaneko/p/6491891.html
Copyright © 2011-2022 走看看