题目来源
题目描述
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
}
};
题目解析
虽然题目中没说是二叉搜索树,但这并不影响我们进行中序遍历。
中序遍历时生成新的树
class Solution {
public:
TreeNode* dummy = new TreeNode(-1);
TreeNode *movep = dummy;
void helper(TreeNode* root){
if(root == NULL){
return ;
}
helper(root->left);
movep->right = new TreeNode(root->val);
movep = movep->right;
helper(root->right);
}
TreeNode* increasingBST(TreeNode* root) {
helper(root);
return dummy->right;
}
};
中序遍历后生成新的树
class Solution {
private:
private:
void helper(TreeNode *node, vector<int> & res){
if(node == NULL){
return;
}
helper(node->left, res);
res.push_back(node->val);
helper(node->right, res);
}
public:
TreeNode *increasingBST(TreeNode *root) {
vector<int> res;
helper(root, res);
TreeNode *dummy = new TreeNode(-1);
TreeNode *curr = dummy;
for(int v : res){
curr->right = new TreeNode(v);
curr = curr->right;
}
return dummy->right;
}
};
中序遍历时改变指向
class Solution {
private:
TreeNode *resNode;
public:
void inorder(TreeNode *node) {
if (node == nullptr) {
return;
}
inorder(node->left);
// 在中序遍历的过程中修改节点指向
resNode->right = node;
node->left = nullptr;
resNode = node;
inorder(node->right);
}
TreeNode *increasingBST(TreeNode *root) {
TreeNode *dummyNode = new TreeNode(-1);
resNode = dummyNode;
inorder(root);
return dummyNode->right;
}
};