描述
要求:
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');
}