#include <iostream>
// 定义二叉树节点模板
template<typename DataType>
class BiNode {
public:
DataType data;
BiNode<DataType>* lchild;
BiNode<DataType>* rchild;
BiNode(DataType val) : data(val), lchild(nullptr), rchild(nullptr) {}
};
// 定义二叉树模板
template<typename DataType>
class BiTree {
private:
BiNode<DataType>* root;
// 私有成员函数:求二叉树的结点个数
int getNodeNum(BiNode<DataType>* bt) {
if (bt == nullptr) {
return 0;
}
return 1 + getNodeNum(bt->lchild) + getNodeNum(bt->rchild);
}
// 私有成员函数:按前序次序打印出二叉树中的叶子结点
void PreOrderLeaf(BiNode<DataType>* bt) {
if (bt != nullptr) {
if (bt->lchild == nullptr && bt->rchild == nullptr) {
std::cout << bt->data << " ";
}
PreOrderLeaf(bt->lchild);
PreOrderLeaf(bt->rchild);
}
}
// 私有成员函数:求二叉树的深度
int getDepth(BiNode<DataType>* bt) {
if (bt == nullptr) {
return 0;
}
int leftDepth = getDepth(bt->lchild);
int rightDepth = getDepth(bt->rchild);
return std::max(leftDepth, rightDepth) + 1;
}
public:
// 构造函数
BiTree() : root(nullptr) {}
// 公共成员函数:求二叉树的结点个数
void getNodeNum() {
std::cout << "Total number of nodes: " << getNodeNum(root) << std::endl;
}
// 公共成员函数:按前序次序打印出二叉树中的叶子结点
void PreOrderLeaf() {
std::cout << "Leaf nodes in pre-order: ";
PreOrderLeaf(root);
std::cout << std::endl;
}
// 公共成员函数:求二叉树的深度
int getDepth() {
return getDepth(root);
}
};
int main() {
// 创建二叉树实例
BiTree<char> tree;
// 假设我们有一个二叉树,可以在这里添加节点
// 例如:
// tree.root = new BiNode<char>('A');
// tree.root->lchild = new BiNode<char>('B');
// tree.root->rchild = new BiNode<char>('C');
// tree.root->lchild->lchild = new BiNode<char>('D');
// tree.root->lchild->rchild = new BiNode<char>('E');
// 计算并打印结点个数
tree.getNodeNum();
// 按前序打印叶子结点
tree.PreOrderLeaf();
// 计算并打印二叉树的深度
std::cout << "Depth of the tree: " << tree.getDepth() << std::endl;
return 0;
}