题目
链接: 897.
题目描述:给你一棵二叉搜索树,请你按中序遍历将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
提示:
树中节点数的取值范围是 [1, 100]
0 <= Node.val <= 1000
思路
其实这道题就是中序遍历并重新建立一棵树,主要是考的建立树的操作。
结果与不足之处
结果:执行用时:4ms,在所有 C++ 提交中击败了51.95%的用户;
内存消耗:7.7MB,在所有 C++ 提交中击败了52.46%的用户。
标准解法里面使用数组进行储存再建树,可以简化指针操作。
新知识
-
结构体初始化函数可以自动完成空间申请,返回指向这个空间的指针:
TreeNode* newroot = new TreeNode(); -
对指针的思考: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。