目录
前言
题目链接:LCR 052. 递增顺序搜索树 - 力扣(LeetCode)
题目:
给定一棵二叉搜索树,请调整节点的指针使每个节点都没有左子节点。调整之后的树看起来像一个链表,但仍然是二叉搜索树。例如,把下图 (a) 中的二叉搜索树按照这个规则展平之后的结果如下图 (b) 所示。
分析:
先分析展平之后二叉树的特性。它仍然是一棵二叉搜索树,而且它除叶节点外每个节点都只有右子节点。由于二叉搜树中右子节点大于或等于它的父节点,因此调整之后的二叉搜索树从根节点开始顺着指向右子节点的指针向下经过的节点的值将是递增排序的。
看起来需要按照节点的值递增的顺序遍历二叉搜索树中的每个节点,并将节点用指向右子节点的指针连接起来。这就容易让人联想到二叉树的中序遍历,只是在这里每遍历到一个节点要把前一个节点的指向右子节点的指针指向它。
递归实现
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
TreeNode* result = root;
while (result->left)
{
result = result->left;
}
TreeNode* prev = nullptr;
inOrder(root, prev);
return result;
}
private:
void inOrder(TreeNode* root, TreeNode*& prev)
{
if (root == nullptr)
return;
inOrder(root->left, prev);
root->left = nullptr;
if (prev != nullptr)
prev->right = root;
prev = root;
inOrder(root->right, prev);
}
};
迭代实现
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* result = nullptr;
TreeNode* prev = nullptr;
TreeNode* cur = root;
while (cur || !st.empty())
{
while (cur)
{
st.push(cur);
cur = cur->left;
}
cur = st.top();
st.pop();
cur->left = nullptr;
if (prev == nullptr)
result = cur;
else
prev->right = cur;
prev = cur;
cur = cur->right;
}
return result;
}
};