• 二叉树的基本操作


    基本结构及其工具

    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
  • 相关阅读:
    js模版引擎Mustache介绍
    springMVC学习篇
    MyBatis参数传入集合之foreach动态sql
    eclipse注册码生成,在eclipse3.3.x上测试可用
    B
    jAVA笔记二
    J 分班(class)(NYIST 2019年校赛)
    H 幻方变换(puzzle)(NYIST 2019年校赛)
    E 旅游方案(travel)(南阳理工学院2019年校赛)
    ACM Computer Factory(网络流 POJ 3436,这可是我第一次写网络流)
  • 原文地址:https://www.cnblogs.com/datakv/p/5629505.html
Copyright © 2020-2023  润新知