本文介绍了二叉树的基本概念,包括二叉树节点的类定义、二叉树的类定义及其基本操作,如前序、中序、后序遍历方法,并提供了创建二叉树的具体实现。

树的基本操作

树的类定义

template <class T>
class Tree
{
public:
    Tree();
}

二叉树结点的类定义

template <class T>
struct BinTreeNode
{
    T data;
    BinTreeNode<T> *lchild, *rchild;
    BinTreeNode(){lchild = NULL; rchild == NULL}
    BinTreeNode(T &x, BinTreeNode *l = NULL, BinTreeNode *r = NULL)
    {
        data = x;
        lchild = l;
        rchild = r;
    }
}

二叉树的类定义

template <class T>
class BinaryTree
{
public:
    BinaryTree(BinaryTree<T> *lchild, BinaryTree<T> *rchild,
        T item);
    void InOrder(BinTreeNode<T> *subTree);
    void PreOrder(BinTreeNode<T> *subTree);
    void PostOrder(BinTreeNode<T> *subTree);
    void Create(BinaryTree &t);
    int Height();
    int Size();
private:
    BinTreeNode<T> *root;
}

template <class T>
void BinTreeNode<T> :: InOrder(BinTreeNode<T> *subTree)
{
    if(subTree != NULL)
    {
        InOrder(subTree -> lchild);
        visit(subTree);
        InOrder(subTree -> rchild);
    }
}

template <class T>
void BinTreeNode<T> :: PreOrder(BinTreeNode<T> *subTree)
{
    if(subTree != NULL)
    {
        visit(subTree);
        InOrder(subTree -> lchild);
        InOrder(subTree -> rchild);
    }
}

template <class T>
void BinTreeNode<T> :: PostOrder(BinTreeNode<T> *subTree)
{
    if(subTree != NULL)
    {
        InOrder(subTree -> lchild);
        InOrder(subTree -> rchild);
        visit(subTree);
    }
}

template <class T>
int BinaryTree<T> :: Size(BinTreeNode<T> *subTree)
{
    if(subTree == NULL)
        return 0;
    else
    {
        return 1+Size(subTree -> lchild)+Size(subTree -> rchild);
    }
}

template <class T>
int BinaryTree<T> :: Height(BinTreeNode<T> *subTree)
{
    if(subTree == NULL)
        return 0;
    else
    {
        int i = Height(subTree -> lchild);
        int j = Height(subTree -> rchild);
        return (i>j) ? i+1:j+1;
    }
}

前序遍历建立二叉树

void Create(BinaryTree &t)
{
    T c;
    cin >> c;
    if('#' == c)        /*输入结束标识符*/
        t = NULL;
    else
    {
        t = new BinaryTreeNode<T>;

        t -> data = c;
        Create(t -> lchild);
        Create(t -> rchild);
    }
}

BFS

template <class T>
void BreadFirstSearch(BinaryTree<T> *root)
{
    Queue<BinTreeNode *> nodeQueue;

    nodeQueue.EnQueue(root);
    BinTreeNode *node;
    while(!nodeQueue.IsEmpty())
    {
        node = nodeQueue.front();
        cout << node -> data << endl;
        nodeQueue.DeQueue(node);

        if(node -> lchild)
            nodeQueue.EnQueue(node -> lchild);
        if(node -> rchild)
            nodeQueue.EnQueue(node -> rchild);
    }
}

DFS

template <class T>
void DepthFirstSearch(BinaryTree<T> *root)
{
    Stack<BinTreeNode *> nodeStack;

    nodeStack.push(root);
    while(!nodeStack.IsEmpty())
    {
        root = nodeStack.top();
        cout << root -> data << endl;
        nodeStack.pop();

        if(root -> lchild)
            nodeStack.push(root -> lchild);
        if(root -> rchild)
            nodeStack.push(root -> rchild);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值