统计树中节点、叶子节点个数、统计树的高度、二叉树左右子树的交换

描述
要求:

1.采用二叉链表的方式进行存储

2.构造一个二叉树类

实现以下算法:

1.统计树中节点个数

2.统计树中叶子节点个数

3.统计树的高度

4.二叉树左右子树的交换

输入
扩展的前序序列.在一棵树处理结束后,根据响应判断是否处理下一棵树
输出
按要求输出信息(节点个数,叶子节点个数,二叉树的高度,交换之后的前序遍历)
样例输入
abc####
Y
ab##c##
N
样例输出
3
1
3
abc

3
2
2
acb

#include <bits/stdc++.h>
using namespace std;
template <class t>
struct BiNode
{
    t data;
    BiNode<t> *lchild, *rchild;
};

template <class t>
class BiTree
{

public:
    int num = 0;
    BiTree() { root = Creat(); }
    ~BiTree() { Release(root); }
    void leafnum() { leafnode(root, &num); }

    int treedepth()
    {
        return treeheight(root);
    }
    int jiediannum()
    {
        return jiediannum(root); 
    }
    void exchange(){
        exchange(root);
    }
    void preorder(){
        preorder(root);
    }

private:
    BiNode<t> *Creat();            //构造函数调用
    void Release(BiNode<t> *root); //析构函数

    void leafnode(BiNode<t> *root1, int *num)
    {
        if (root1 == nullptr)
            return;
        if (root1->lchild == nullptr && root1->rchild == nullptr)
        {
            (*num)++;
        }
        leafnode(root1->lchild, num);
        leafnode(root1->rchild, num);
    }
    int treeheight(BiNode<t> *bt)
    {
        if (bt == nullptr)
            return 0;
        int left, right;
        left = treeheight(bt->lchild);
        right = treeheight(bt->rchild);
        int max = left > right ? left : right;
        return max + 1;
    }
    int jiediannum(BiNode <t>*root)
    {
        if(root==nullptr) return 0;
        else
        {
            int n;
            n=jiediannum(root->lchild)+jiediannum(root->rchild)+1;
            return n;
        }
        
    }
    void exchange(BiNode<t> *root)
    {
        if(!root) return;
        else
        {
            BiNode <t> *p;
            p=root->lchild;
            root->lchild=root->rchild;
            root->rchild=p;
            exchange(root->lchild);
            exchange(root->rchild);
        }
        
    }
    void preorder(BiNode <t>*bt)
    {
        if(bt==nullptr)
        return;
        cout<<bt->data;
        preorder(bt->lchild);
        preorder(bt->rchild);
    }

    BiNode<t> *root;
};
template <class t>
BiNode<t> *BiTree<t>::Creat()
{
    BiNode<char> *bt;
    t ch;
    cin >> ch;
    if (ch == '#')
        bt = nullptr;
    else
    {
        bt = new BiNode<t>;
        bt->data = ch;
        bt->lchild = Creat();
        bt->rchild = Creat();
    }
    return bt;
}
template <class t>
void BiTree<t>::Release(BiNode<t> *root)
{
    if (root == nullptr)
        return;
    else
    {
        Release(root->lchild);
        Release(root->rchild);
        delete root;
    }
}

int main()
{
    char n;
    do{
        BiTree<char> b;
    cout<<b.jiediannum()<<endl;
    b.leafnum();
    cout << b.num << endl;
    cout << b.treedepth()<<endl;
    b.exchange();
    b.preorder();
    cout<<endl;
    }
    while(cin>>n&&n=='Y');
    
}
发布了41 篇原创文章 · 获赞 5 · 访问量 2991

猜你喜欢

转载自blog.csdn.net/qq_43573743/article/details/103756210