数据结构(十二)、C++ 反转二叉搜索树

(十二)、反转二叉搜索树

#include <iostream>
#include <queue>
/**
 * @namespace 反转二叉搜索树
 */
namespace tree_Reverse
{
    template<class T>
    class Tree
    {
    public:
        struct node
        {
            node(T data) :m_data(data), m_left(nullptr), m_right(nullptr) {}
            T m_data;
            node* m_left;
            node* m_right;
        };
        Tree() :m_root(nullptr) {}

        /**
         * @brief 插入
         */
        void insert(T m_pData)
        {
            m_root = insert(m_root, m_pData);
        }

        /**
         * @brief 反转
         */
        void reverse()
        {
            m_root = reverse(m_root);
        }


        /**
         * @brief 层次遍历(队列实现)
         */
        void print_level()
        {
            std::queue<node*> queTree;
            node* temp = m_root;
            queTree.push(temp);
            while (!queTree.empty())
            {
                temp = queTree.front();
                queTree.pop();
                std::cout << temp->m_data << " ";

                if (temp->m_left != nullptr)
                    queTree.push(temp->m_left);
                if (temp->m_right != nullptr)
                    queTree.push(temp->m_right);
            }
            std::cout << std::endl;
        }

    private:
        /**
         * @brief 插入
         */
        node* insert(node* m_pRoot, T m_pData)
        {
            if (m_pRoot == nullptr)
                return new node(m_pData);
            if (m_pData <= m_pRoot->m_data)
            {
                m_pRoot->m_left = insert(m_pRoot->m_left, m_pData);
            }
            else if (m_pData > m_pRoot->m_data)
            {
                m_pRoot->m_right = insert(m_pRoot->m_right, m_pData);
            }
            return m_pRoot;
        }

        /**
         * @brief 反转
         */
        node* reverse(node* m_pRoot)
        {
            if (m_pRoot == nullptr)
                return m_pRoot;
            node* temp = m_pRoot->m_left;
            m_pRoot->m_left = reverse(m_pRoot->m_right);
            m_pRoot->m_right = reverse(temp);
            return m_pRoot;
        }

    private:
        node* m_root;
    };

    void test_tree_Reverse()
    {
        tree_Reverse::Tree<int> m_tree;
        m_tree.insert(4);
        /*
              (4)       
        */

        m_tree.insert(6);
        /*
              (4) 
                 \
                 (6)
        */

        m_tree.insert(8);
        /*
              (4)
                 \
                 (6)
                   \
                   (8)
        */

        m_tree.insert(2);
        /*
              (4)
               / \
             (2) (6)
                   \
                   (8)
        */

        m_tree.insert(3);
        /*
              (4)
               / \
             (2) (6)
               \    \
               (3)  (8)
        */

        m_tree.insert(1);
        /*
              (4)
               / \
             (2) (6)
            /  \    \
          (1)  (3)  (8)
        */

        m_tree.insert(5);
        /*
              (4)
               / \
             (2)  (6)
            /  \   / \
          (1) (3)(5) (8)
        */

        m_tree.insert(9);
        /*
                 (4)
                 /  \
               (2)   (6)
              /   \  /  \
            (1)  (3)(5) (8)
                          \
                          (9)
        */

        std::cout << "Tree level(层次遍历):";
        m_tree.print_level();        // 4 2 6 1 3 5 8 9

        std::cout << "Tree reverse(层次遍历):";
        m_tree.reverse();
        m_tree.print_level();        // 4 6 2 8 5 3 1 9
        /*
                 (4)                           (4)
                 /  \                          /  \
               (2)   (6)         反转        (6)   (2)
              /   \  /  \       =====>      /   \  /  \
            (1)  (3)(5) (8)               (8)  (5)(3) (1)
                          \               /
                          (9)            (9)
        */
    }
}// namespace tree_Reverse
int main()
{
	tree_Reverse::test_tree_Reverse();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值