C++ 二叉搜索树转换为双向链表

描述

        输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表:

代码

#include <iostream>
#include <string>
#include <optional>

struct TreeNode
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x): val(x), left(nullptr), right(nullptr) {}                        
};


class BinarySearchTree 
{
public:
    BinarySearchTree(): root(nullptr) {}

    void insert(int val)
    {
        root = insertRec(root, val);
    }

    void inorder()
    {
        inorderRec(root);
        std::cout << std::endl;        
    }

    bool search(int val)
    {
        return searchRec(root, val);
    }
protected:
    TreeNode* insertRec(TreeNode* node, int val)
    {
        if(node == nullptr)
        {
            return new TreeNode(val);
        }

        if(val < node->val)
        {
            node->left = insertRec(node->left, val);
        }
        else if(val > node->val)
        {
            node->right = insertRec(node->right, val);
        }

        return node; 
    }    


    void inorderRec(TreeNode* node)
    {
        if(node != nullptr) 
        {
            inorderRec(node->left);
            std::cout << node->val << " ";
            inorderRec(node->right);
        }
    }

    bool searchRec(TreeNode* node, int val)
    {
         if(node == nullptr)
         {
            return false; 
         }

         if(node->val == val)
         {
            return true; 
         }

         if(val > node->val)
         {
            return searchRec(node->left, val);
         }
         else 
         {
            return searchRec(node->right, val);
         }
    }
public:
    TreeNode* root;
};

class Solution 
{
public:
    TreeNode* head = nullptr; 
    TreeNode* pre = nullptr; 
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr)
        {
            return nullptr;
        }

        Convert(pRootOfTree->left);
        if(pre == nullptr)
        {
            head = pRootOfTree;
            pre = pRootOfTree;
        }
        else 
        {
            pre->right = pRootOfTree;
            pRootOfTree->left = pre;
            pre = pRootOfTree;
        }

        Convert(pRootOfTree->right);

        return head; 
    }
};


int main()
{
   BinarySearchTree bst;

    bst.insert(10);
    bst.insert(6);
    bst.insert(14);
    bst.insert(4);
    bst.insert(8);
    bst.insert(12);
    bst.insert(16);

    std::cout << "bst convert to doublelist:";
    Solution s; 
    TreeNode* head =   s.Convert(bst.root);
    while(head)
    {
        std::cout << head->val << " ";
        head = head->right;
    }
    std::cout << std::endl;


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑不溜秋的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值