Leetcode897. 递增顺序搜索树

题目

链接: 897.

题目描述:给你一棵二叉搜索树,请你按中序遍历将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。

提示:
  树中节点数的取值范围是 [1, 100]
  0 <= Node.val <= 1000

思路

  其实这道题就是中序遍历并重新建立一棵树,主要是考的建立树的操作。

结果与不足之处

结果:执行用时:4ms,在所有 C++ 提交中击败了51.95%的用户;
内存消耗:7.7MB,在所有 C++ 提交中击败了52.46%的用户。
标准解法里面使用数组进行储存再建树,可以简化指针操作。

新知识

  1. 结构体初始化函数可以自动完成空间申请,返回指向这个空间的指针:
    TreeNode* newroot = new TreeNode();

  2. 对指针的思考:DFS函数入参中的TreeNode* newroot虽然是指针,但是实际上是一个局部变量,在传递中会改变,所以需要返回进行修改,可以使用指针的指针来进行。

自己的代码

/**
 * 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* DFS(TreeNode* root, TreeNode* newroot){
        if(root->left != nullptr){
            newroot = DFS(root->left, newroot);
        }
        if(root != nullptr){
            newroot->right = new TreeNode(root->val);
            newroot = newroot->right;
        }
        if(root->right != nullptr){
            newroot = DFS(root->right, newroot);
        }

        return newroot;
    }

    TreeNode* increasingBST(TreeNode* root) {
        TreeNode* newroot = new TreeNode();
        DFS(root, newroot);
        return newroot->right;
    }
};

指针的指针版本:

class Solution {
public:
    void DFS(TreeNode* root, TreeNode** newroot){
        if(root->left != nullptr){
            DFS(root->left, newroot);
        }
        if(root != nullptr){
            (*newroot)->right = new TreeNode(root->val);
            (*newroot) = (*newroot)->right;
        }
        if(root->right != nullptr){
            DFS(root->right, newroot);
        }
    }

    TreeNode* increasingBST(TreeNode* root) {
        TreeNode* newroot = new TreeNode();
        TreeNode* returnroot = newroot;
        TreeNode** newrootadd = &newroot;
        DFS(root, newrootadd);
        return returnroot->right;
    }
};

官方代码

class Solution {
public:
    void inorder(TreeNode *node, vector<int> &res) {
        if (node == nullptr) {
            return;
        }
        inorder(node->left, res);
        res.push_back(node->val);
        inorder(node->right, res);
    }

    TreeNode *increasingBST(TreeNode *root) {
        vector<int> res;
        inorder(root, res);

        TreeNode *dummyNode = new TreeNode(-1);
        TreeNode *currNode = dummyNode;
        for (int value : res) {
            currNode->right = new TreeNode(value);
            currNode = currNode->right;
        }
        return dummyNode->right;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/increasing-order-search-tree/solution/di-zeng-shun-xu-cha-zhao-shu-by-leetcode-dfrr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值