BST 二叉搜索树性质:
- 中序遍历为有序
- 左子树所有节点小于根节点、右子树所有节点大于根节点
本题利用 BST 中序遍历为有序 的性质,改变二叉树的指针指向 即可原地构建有序的双向链表
节点类型
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;
}
};
解法代码
Node* preNode = nullptr; // 记录上一个节点
void traverse(Node* root)
{
// base case
if (root == nullptr)
{
return;
}
traverse(root->left);
// 中序遍历位置,构建双向链表
if (preNode != nullptr) // 第一个节点不动,避免进入死循环
{
preNode->right = root;
root->left = preNode;
}
preNode = root;
traverse(root->right);
}
Node* treeToDoublyList(Node* root) {
// base case
if (root == nullptr)
{
return nullptr;
}
// 找到头节点
Node* first = root;
while (first->left != nullptr)
{
first = first->left;
}
traverse(root);
// 构建循环链表
first->left = preNode;
preNode->right = first;
return first;
}