<仅是自己做笔记。。。系列-7>输入一颗二元查找树,将该树转换为它的镜像

来源:互联网 发布:修改oracle默认端口 编辑:程序博客网 时间:2024/05/16 11:15
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
例如输入:
        8
     /      \
  6         10
 /   \      /    \
5    7  9     11

输出:
        8
     /      \
  10         6
 /   \      /    \

11  9   7     5

#include <iostream>using namespace std;class CTwoTree{public:    struct BSTreeNode    {      int m_nValue; // value of node      BSTreeNode *m_pLeft; // left child of node      BSTreeNode *m_pRight; // right child of node    };    CTwoTree()    {        proot = NULL;    }    void CAddNode(int m_nValue, BSTreeNode * &p)    {        if(p == NULL)        {            p = new BSTreeNode;            p->m_nValue = m_nValue;            p->m_pLeft = NULL;            p->m_pRight = NULL;            return;        }        if(m_nValue > p->m_nValue)        {            CAddNode(m_nValue, p->m_pRight);        }        else if(p->m_nValue > m_nValue)        {            CAddNode(m_nValue, p->m_pLeft);        }    }    void CAddNode(int m_nValue)    {        CAddNode(m_nValue, proot);    }    void swap(BSTreeNode * &p)    {        BSTreeNode * tmp = p->m_pLeft;        p->m_pLeft = p->m_pRight;        p->m_pRight = tmp;    }    void mirror(BSTreeNode * p)    {        if(p == NULL)            return;        swap(p);        mirror(p->m_pLeft);        mirror(p->m_pRight);    }    void mirror()    {        mirror(proot);    }    void deleter(BSTreeNode *p)    {        if(p == NULL)            return;        deleter(p->m_pLeft);        deleter(p->m_pRight);    }    ~CTwoTree()    {        deleter(proot);    }private:    BSTreeNode *proot;};int main(int argc, char *argv[]){    CTwoTree a;    a.CAddNode(10);    a.CAddNode(6);    a.CAddNode(4);    a.CAddNode(8);    a.CAddNode(7);    a.CAddNode(9);    a.CAddNode(14);    a.CAddNode(12);    a.CAddNode(16);    a.mirror();    return 0;}


0 0
原创粉丝点击