#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
今日推荐
周排行