参考链接
- https://leetcode-cn.com/problems/increasing-order-search-tree/
- https://leetcode-cn.com/problems/increasing-order-search-tree/solution/di-zeng-shun-xu-cha-zhao-shu-by-leetcode-dfrr/
题目描述
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
解题思路
主要考察中序遍历,记得写在左子树遍历和右子树遍历中间就好了。具体的做法有两种,一种是先中序遍历搜索树,得到递增数组,然后构建一棵新的树;另一种是一边中序遍历一边修改节点指向。
代码
构建新搜索树
class Solution {
public:
vector<int> arr;
void traverse(TreeNode* root)
{
if (root == nullptr)
{
return;
}
traverse(root->left);
arr.push_back(root->val);
traverse(root->right);
}
TreeNode* increasingBST(TreeNode* root) {
traverse(root);
TreeNode* res = new TreeNode(arr[0]);
TreeNode* p = res;
for (int i = 1; i < arr.size(); i ++)
{
TreeNode* node = new TreeNode(arr[i]);
p->right = node;
p = node;
}
return res;
}
};
一步到位
class Solution {
private:
TreeNode *resNode;
public:
void traverse(TreeNode *node) {
if (node == nullptr) {
return;
}
traverse(node->left);
resNode->right = node;
node->left = nullptr;
resNode = node;