数据结构之二叉树(C++)(二)


目录 (Table of Contents)


二叉树的操作

二叉树是一种特殊的树,在上一节中也介绍了树的其他形式,例如:霍夫曼树,B树等。其中,二叉树的常用操作有
1. 确定树高
2. 确定元素数目
3. 复制
4. 显示或打印二叉树
5. 确定两颗二叉树是否一样
6. 删除整颗树

这些操作都可以通过有步骤的遍历二叉树来完成,如果不知道如何遍历二叉树的话请返回:数据结构之二叉树(一)

二叉树的完整构建(续)

在构建二叉树,我们先要知道二叉树的数据成员和成员函数应该是什么。首先数据成员要有记录树节点的变量,以便我们返回树的节点个数,一个指向根节点的指针(可用于遍历操作等)。成员函数中,我们应该有上述提到的所有部分或全部操作(每个人的需求不一样,看自己的数据结构需要什么,自由组合等等)。因此代码实现为:

template <typename T>
class linkedBinaryTree : public binaryTree<binaryTreeNode<T>>
{
public:
    linkedBinaryTree();
    ~linkedBinaryTree(erase(););
    bool emtpy() const {return m_iTreeSize == 0; }
    void preOrder(void (*theVisit)(binaryTreeNode<T>*))
    {
        visit = theVist;
        preOrder(m_pRoot);
    }
    void inOrder(void (*theVisit)(binaryTreeNode<T>*))
    {
        visit = theVist;
        inOrder(m_pRoot);
    }
    void postOrder(void (*theVisit)(binaryTreeNode<T>*))
    {
        visit = theVist;
        postOrder(m_pRoot);
    }

    void int size() const {return m_iTreeSize; }
    void levelOrder(void (*)(binaryTreeNode<T>*));
    void erase()
    {
        postOrder(dispose);
        m_pRoot = NULL;
        treeSize = 0;
    }

private:
    int m_iTreeSize;
    binaryTreeNode<T> *m_pRoot;     // 指向根节点
    static void (*visit))(binaryTreeNode<T> *);     // 访问函数
    static void preOrder(binaryTreeNode<T> *);          // 前序遍历
    static void inOrder(binaryTreeNode<T> *);             // 中序遍历
    static void dispose(binaryTreeNode<T> *t) {delete t;}           // 后序遍历
}

注意事项:

void (*)(binaryTreeNode<T>*)

是一种函数类型,这种函数的返回值为void, 它的参数类型为binaryTreeNode<T> *, 即是一个指针

如何获取树的高度

思路:首先取它左子树的高度,然后取它右子树的高度,最后把左右子树高度的最大值加1,取得树的高度

删除整颗树

思路:前序或中序或后序遍历,每次遍历删除节点即可

比较两颗树是否相等

思路:如果两颗树的节点数不一样,则直接输出不相等,前序,中序或后序遍历每个节点的节点元素,两颗树进行数值比较

类的部分实现

遍历

template <typename T>
void linkedBinaryTree<T>::preOrder(binaryTreeNode<T> *t)
{
    if(t != NULL)
    {
        linkedBinaryTree<T>::printvalue(t);
        preOrder(t->leftChild);
        preOrder(t->rightChild);
    }
}

树的高度

template <typename T>
int linkedBinaryTree<T>::height(binaryTreeNode<T> *t)
{
    if(t == NULL)
        return 0;
    int hl = height(t->leftChild);
    int hr = height(t->rightChild);
    if (hl > hr)
        return ++hl;
    else
        return ++hr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值