二叉树的基本操作

基本结构及其工具

typedef int DataBype;

#define PRINTDIVIDE cout << endl << "##########################################" << endl;

class Node

{
public:
    DataBype v;
    Node * l;
    Node * r;
    Node()
    {
        v = 0;
        l = NULL;
        r = NULL;
    }
private:
};

typedef Node * PN;

template<class T>
void exchange(T & f, T & s)
{
    T t = f;
    f = s;
    s = t;
};

使用vector初始化二叉树

void BS::initwithivsbylevel( vector<DataBype> vs )
{
    queue<PN> tqn;
    if (!vs.empty())
    {
        m_nroot = new Node;
        m_nroot->v = vs[0];
        tqn.push(m_nroot);
        for (int i = 1; i < vs.size();)
        {
            PN cn = tqn.front();
            tqn.pop();
            PN tn = new Node;
            tn->v = vs[i ++];
            cn->l = tn;
            tqn.push(tn);
            
            if (i < vs.size())
            {
                tn = new Node;
                tn->v = vs[i ++];
                cn->r = tn;
                tqn.push(tn);
            }
        }
    }
}

打印第level 层

void BS::printlevel(PN root, int level )
{
    if (NULL == root)
        return;
    if (0 == level)
        cout << root->v    << " ";
    printlevel(root->l, level - 1);
    printlevel(root->r, level - 1);
}

得到树的深度

int BS::getlevel(const PN root )
{
    if (NULL == root)
        return 0;
    return max(getlevel(root->l), getlevel(root->r)) + 1;
}

层遍历打印二叉树

void BS::printself()
{
    int alllevel = getlevel(m_nroot);
    for (int i = 0; i < alllevel; ++ i)
    {
        printlevel(m_nroot, i);
        cout << endl;
    }
}

递归先序、中序、后序遍历二叉树

void BS::preorder_recursion( const PN root )
{
    if (NULL != root)
    {
        cout << root->v    << " ";
        preorder_recursion(root->l);
        preorder_recursion(root->r);
    }
}

void BS::inorder_recursion( const PN root )
{
    if (NULL != root)
    {
        inorder_recursion(root->l);
        cout << root->v    << " ";
        inorder_recursion(root->r);
    }
}

void BS::postorder_recursion( const PN root )
{
    if (NULL != root)
    {
        postorder_recursion(root->l);
        postorder_recursion(root->r);
        cout << root->v    << " ";
    }
}

非递归先序遍历

void BS::preorder_no_recursion( const PN root )
{
    stack<PN> spn;
    PN tpn = root;
    while (NULL != tpn || !spn.empty())
    {
        while (NULL != tpn)
        {
            cout << tpn->v    << " ";
            spn.push(tpn);
            tpn = tpn->l;
        }
        if (!spn.empty())
        {
            tpn = spn.top();
            spn.pop();
            tpn = tpn->r;
        }
    }
}

非递归中序遍历

void BS::inorder_no_recursion( const PN root )
{
    stack<PN> spn;
    PN tpn = root;
    while (NULL != tpn || !spn.empty())
    {
        while (NULL != tpn)
        {
            spn.push(tpn);
            tpn = tpn->l;
        }
        if (!spn.empty())
        {
            tpn = spn.top();
            cout << tpn->v    << " ";
            spn.pop();
            tpn = tpn->r;
        }
    }
}

非递归后序遍历

void BS::postorder_no_recursion( const PN root )
{
    stack<PN> spn;
    PN tpn = NULL;
    PN pre = NULL;

    spn.push(root);
    while (!spn.empty())
    {

        tpn = spn.top();
        if ((NULL == tpn->l && NULL == tpn->r) || ( pre != NULL && (pre == tpn->l || pre == tpn->r) ))
        {
            cout << tpn->v    << " ";
            pre = tpn;
            spn.pop();
        }
        else
        {
            if (NULL != tpn->r)
                spn.push(tpn->r);
            if (NULL != tpn->l)
                spn.push(tpn->l);
        }
    }
}

二叉树反转(递归和非递归)

void BS::reverse_recursion( PN root )
{
    if (NULL != root)
    {
        exchange(root->l, root->r);
        reverse_recursion(root->l);
        reverse_recursion(root->r);
    }
}

void BS::reverse_no_recursion( PN root )
{
    queue<PN> qpn;
    PN tpn = root;
    qpn.push(root);
    while (!qpn.empty())
    {
        tpn = qpn.front();
        qpn.pop();
        exchange(tpn->l, tpn->r);
        if (NULL != tpn->l)
            qpn.push(tpn->l);
        if (NULL != tpn->r)
            qpn.push(tpn->r);
    }
}

得到第k层节点个数

int BS::countklevel( const PN root, int k )
{
    if (NULL == root || k < 0)
        return 0;
    if (0 == k)
        return 1;
    return countklevel(root->l, k - 1) + countklevel(root->r, k - 1);
}

是否包含节点

bool BS::find_node( const PN root, const DataBype & o)
{
    if (NULL == root || (o != root->v && !find_node(root->l, o) && !find_node(root->r, o)))
        return false;
    return true;

}

最近公共祖先

PN BS::getLCP(const PN root, const DataBype & f, const DataBype & s)
{
    if (NULL == root || f == root->v || s == root->v)
        return root;
    if (find_node(root->l, f))
    {
        if (find_node(root->r, s))
            return root;
        return getLCP(root->l, f, s);
    }
    if (find_node(root->r, f))
    {
        if (find_node(root->l, s))
            return root;
        return getLCP(root->r, f, s);
    }
    return NULL;
}

二叉树转线性表

PN BS::to_linklist_recursion( PN root)
{
    if (NULL == root)
        return NULL;
    PN tl = to_linklist_recursion(root->l);
    PN head = root;
    if (NULL != tl)
    {
        head = tl;
        while (tl->r)
            tl = tl->r;
        tl->r = root;
        root->l = tl;
    }

    PN tr = to_linklist_recursion(root->r);
    root->r = tr;
    if (NULL != tr)
        tr->l = root;
    return head;
}
出自datakv
原文地址:https://www.cnblogs.com/datakv/p/5629505.html