数据结构(C++实现)--二叉树

2018-11-14  本文已影响0人  ustclcl

二叉树

二叉树是每个父节点最多只有两个子节点


binarytree

如图,是表达式的二叉树的表示。
引申出:

二叉树的表示可以用数组或者链表,使用数组时,可以用空位表示不存在的子节点,但极端情况下可能会浪费空间。比如一种右斜二叉树


rightskewedBinaryTree

使用链表表示则更符合我们的一般认知。每个节点有左子节点LeftChild,右子节点RightChild和数据域Data。
节点的类如下

template <typename T>
class BinaryTreeNode
{
    friend void Visit(BinaryTreeNode<T>*);
    friend void InOrder(BinaryTreeNode<T>*);
    friend void PreOrder(BinaryTreeNode<T>*);
    friend void PostOrder(BinaryTreeNode<T>*);
    friend void LevelOrder(BinaryTreeNode<T>*);
    friend void main(void);
public:
    BinaryTreeNode()(LeftChild = RightChild = 0;)
    BinaryTreeNode(const T& e)
    {
        data = e;
        LeftChild = RightChild = 0;
    }
    BinaryTreeNode(const T& e, BinaryTreeNode* l, BinaryTreeNode* r)
    {
        data = e;
        LeftChild = l;
        RightChild = r;
    }
private:
    T data;
    BinaryTreeNode<T>* LeftChild;
    BinaryTreeNode<T>* RightChild;
};

私有成员有data和左右节点。同时构造函数有三种形式:

使用一个节点来保存二叉树的根。通常我们不需要父节点指针。

二叉树的常用操作

二叉树的常用操作有:

以上操作均需要二叉树的遍历

template <typename T>
void PreOrder(BinaryTreeNode<T> * t)
{
    if(t)
    {
        Visit(t);
        PreOrder(t->LeftChild);
        PreOrder(t->RightChild);
    }
}
void InOrder(BinaryTreeNode<T> * t)
{
    if(t)
    {

        InOrder(t->LeftChild);
        Visit(t);
        InOrder(t->RightChild);
    }
}
template <typename T>
void PostOrder(BinaryTreeNode<T> * t)
{
    if(t)
    {

        PostOrder(t->LeftChild);
        PostOrder(t->RightChild);
        Visit(t);
    }
}
template <typename T>

上一篇 下一篇

猜你喜欢

热点阅读