二叉树的高度/销毁一颗二叉树

template<class T>
struct BinaryTreeNode  //创建树中的每个结点
{
    BinaryTreeNode(const T& data)
        :_data(data)
        ,_pLeft(NULL)
        ,_pRight(NULL)
    {}
    T _data; //结点的值
    BinaryTreeNode<T>* _pLeft; //左孩子
    BinaryTreeNode<T>* _pRight; //右孩子
};

template<class T>
class BinaryTree
{
    typedef BinaryTreeNode<T> Node;
public:
    BinaryTree()
        :_pRoot(NULL)
    {}
    //构造函数
    BinaryTree(const T array[], size_t size, const T& invalid)  //按照前序遍历创建一棵树
    {
        //创建树  ->根结点->左子树->右子树
          size_t index = 0;  //引用要被初始化
          _CreateTree(_pRoot, array, size, invalid, index);
    }
    //拷贝构造函数--按照前序遍历再创建一棵树
    BinaryTree(const BinaryTree<T>& t)
    {
        _pRoot = _CopyBinaryTree(t._pRoot); 
    }
    //赋值--拷贝一个一样的树
    BinaryTree<T>& operator=(const BinaryTree<T>& t)
    {
        if (this != &t)
        {
            _DestroyTree(_pRoot);
            _pRoot = _CopyBinaryTree(t._pRoot);
        }
        return *this;
    }
    //先序遍历
    void PreOrder()
    {
        cout << "PreOrder: " << endl;
        _PreOrder(_pRoot);
        cout << endl;
    }
    //获取二叉树的高度
    size_t Height()
    {
        return _Height(_pRoot);
    }
    //析构函数
    ~BinaryTree()
    {
        _DestroyTree(_pRoot);
    }
private:
    void _CreateTree(Node *& pRoot, const T array[], size_t size, const T& invalid, size_t& index)
        //Node *& pRoot是因为_pRoot已经是一个指针了,需要二级指针或一级指针的引用接收
        //因为结点的index是需要被带回的,所以为了改变外部实参要传引用
    {
        if ((index < size) && (array[index] != invalid)) //index<size条件在前先保证index不越界
        {
            //1)、创建根结点
            pRoot = new Node(array[index]);
            //2)、创建根结点的左子树
            _CreateTree(pRoot->_pLeft, array , size, invalid, ++index);
             //3)、创建根结点的右子树
            _CreateTree(pRoot->_pRight, array, size, invalid, ++index);//递归后退时index的值未发生改变
        }
    }  //O(2n+1)->O(n)
    Node* _CopyBinaryTree(Node* pRoot)
    {
        Node* pNewNode = NULL;
        if (NULL != pRoot)
        {
            Node* pNewNode = new Node(pRoot->_data);
            pNewNode->_pLeft = _CopyBinaryTree(pRoot->_pLeft);
            pNewNode->_pRight = _CopyBinaryTree(pRoot->_pRight);
        }
        return pNewNode;
    }
    //销毁二叉树
    void _DestroyTree(Node*& pRoot)
    {
        if (pRoot)
        {
            _DestroyTree(pRoot->_pLeft);
            _DestroyTree(pRoot->_pRight);
            delete pRoot;
            pRoot = NULL;
        }
    }
    void _PreOrder(Node* pRoot)  //先序遍历:根-左子树-右子树
    {
        if (pRoot)
        {
             cout << pRoot->_data << " ";
             //遍历左子树
             _PreOrder(pRoot->_pLeft);
             //遍历右子树
             _PreOrder(pRoot->_pRight);
        }
    }
    //获取二叉树的高度
    size_t _Height(Node* pRoot)
    {
        if (NULL == pRoot)
            return 0;   //空树--高度h=0
        if (NULL == pRoot->_pLeft && NULL == pRoot->_pRight)
            return 1;   //只有根节点---h=1
        size_t leftHeight = _Height(pRoot->_pLeft);  //获取左子树的高度
        size_t rightHeight = _Height(pRoot->_pRight); //获取右子树的高度
        return (leftHeight > rightHeight)? (leftHeight+1):(rightHeight+1);
    }

private:
    BinaryTreeNode<T>* _pRoot;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值