1、题目描述
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。
对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。
2、示例
3、题解
基本思想:中序遍历一遍二叉搜索树,然后对前后节点连接。
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if(root==nullptr)
return root;
vector<Node*> nodes;
stack<Node*> st;
while(!st.empty()||root)
{
while(root)
{
st.push(root);
root=root->left;
}
root=st.top();
st.pop();
nodes.push_back(root);
root=root->right;
}
Node* start=nodes[0],*finish=nodes[nodes.size()-1];
start->left=finish;
finish->right=start;
for(int i=0;i<nodes.size();i++)
{
if(i!=nodes.size()-1)
nodes[i]->right=nodes[i+1];
if(i!=0)
nodes[i]->left=nodes[i-1];
}
return start;
}
};
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if(root==nullptr)
return root;
vector<Node*> nodes;
stack<Node*> st;
Node* prev=nullptr,*cur=root,*start;
while(!st.empty()||cur)
{
while(cur)
{
st.push(cur);
cur=cur->left;
}
cur=st.top();
st.pop();
if(prev==nullptr)
start=cur;
else
{
prev->right=cur;
cur->left=prev;
}
prev=cur;
cur=cur->right;
}
start->left=prev;
prev->right=start;
return start;
}
};