二叉树模板

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拔刀能留住落樱嘛.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值