leetcode 426. 将二叉搜索树转化为排序的双向链表 medium
题目描述:
将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。
解题思路:
方法一:递归解决问题,主要就是细心
方法二(这个方法好):因为要求是排序的双向链表,而这颗树是二叉搜索树,所以可以直接用循环的中序遍历来做,搞定每一个节点。
递归代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if (!root)
return root;
Node *l_beg = treeToDoublyList(root->left);
Node *r_beg = treeToDoublyList(root->right);
Node *l_end = l_beg?l_beg->left:nullptr;
if (l_end){
l_end->right = root;
root->left = l_end;
}
Node *beg = l_beg?l_beg:root;
Node *end = r_beg?r_beg->left:root;
if (r_beg){
root->right = r_beg;
r_beg->left= root;
}
beg->left = end;
end->right = beg;
return beg;
}
};
循环代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if (!root)
return root;
Node dummy(0);
Node *pre = &dummy, *cur = root;
stack<Node*> stk;
while (!stk.empty() || cur){
while(cur){
stk.push(cur);
cur = cur->left;
}
cur = stk.top();
stk.pop();
cur->left = pre;
pre->right = cur;
pre = cur;
cur = cur->right;
}
Node *ret = dummy.right;
ret->left = pre;
pre->right = ret;
return ret;
}
};