Leetcode 897. Increasing Order Search Tree (二叉树遍历和分治好题)

  1. Increasing Order Search Tree
    Given the root of a binary search tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only one right child.

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值