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

#include <iostream>
#include <queue>
using namespace std;

struct Node
{
    int value;
    Node* left;
    Node* right;
    Node(int data) : value(data), left(nullptr), right(nullptr) {}
};
//利用队列,按中序遍历的方式将节点放入队列,然后取出重新连接即可
//时间复杂度N,空间复杂度N
void inorder(queue<Node*> &nQue, Node* head)
{
    if(head == nullptr)
        return;
    inorder(nQue, head->left);
    nQue.push(head);
    inorder(nQue,head->right);
}
Node* convertList1(Node* head)
{
    queue<Node*> nQue;
    inorder(nQue, head);
    head = nQue.front();
    nQue.pop();
    Node* pre = head;
    pre->left = nullptr;
    Node* cur = nullptr;
    while(!nQue.empty())
    {
        cur = nQue.front();
        nQue.pop();
        pre->right = cur;
        cur->left = pre;
        pre = cur;
    }
    pre->right = nullptr;
    return head;
}

Node* process(Node* head)
{
    if(head == nullptr)
        return nullptr;
    Node* leftE = process(head->left);
    Node* rightE = process(head->right);
    Node* leftS = leftE != nullptr ? leftE->right : nullptr;
    Node* rightS = rightE != nullptr ? rightE->right : nullptr;

    if(leftE != nullptr && rightE != nullptr)
    {
        leftE->right = head;
        head->left = leftE;
        head->right = rightS;
        rightS->left = head;
        rightE->right = leftS;
        return rightE;
    }
    else if(leftE != nullptr)
    {
        leftE->right = head;
        head->left = leftE;
        head->right= leftS;
        return head;
    }
    else if(rightE != nullptr)
    {
        head->right = rightS;
        head->left = nullptr;
        rightE->right = head;
        rightS->left = head;
        return rightE;
    }
    else
    {
        head->right = head;
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/80683481