Example 1:
Input: root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
Output: [1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
Example 2:
Input: root = [5,1,7]
Output: [1,null,5,null,7]
Constraints:
The number of nodes in the given tree will be in the range [1, 100].
0 <= Node.val <= 1000
解法1:遍历。节点新生成。
/**
* Definition for a binary tree node.
* 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) {
helper(root);
return head;
}
private:
TreeNode *head = NULL, *node = NULL;
void helper(TreeNode *root) {
if (!root) return;
helper(root->left);
if (!head) {
head = new TreeNode(root->val);
node = head;
} else {
node->right = new TreeNode(root->val);
node = node->right;
}
helper(root->right);
}
};
解法2:遍历。节点原地修改。
注意!这里要把root->left设为NULL,而不是把node->left设为NULL。不然最后一个节点的left还是没有更新。
例子:[2,1,4,null,null,3]
4是最后一个处理的节点,如果是node->left = NULL; 那么root=4的left还是指向3。
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
dummy = new TreeNode(0);
node = dummy;
helper(root);
return dummy->right;
}
private:
TreeNode *dummy = NULL, *node = NULL;
void helper(TreeNode *root) {
if (!root) return;
helper(root->left);
node->right = root;
// node->left = NULL;
root->left = NULL; //注意!这里要把root->left设为NULL,而不是把node->left设为NULL。
node = root;
helper(root->right);
}
};
解法2:分治
class Solution {
public:
TreeNode* increasingBST(TreeNode* root) {
if (!root) return NULL;
TreeNode *leftRes = increasingBST(root->left);
TreeNode *rightRes = increasingBST(root->right);
TreeNode *retNode = leftRes ? leftRes : root, *node = leftRes;
if (leftRes) {
while(node && node->right) {
node = node->right;
}
// node->left = NULL; //这一行不需要,因为下面的root->left会处理
node->right = root;
}
root->left = NULL;
root->right = rightRes;
return retNode;
}
};