【题目】给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
来源:leetcode
链接:https://leetcode-cn.com/problems/increasing-order-search-tree/
【提示】
给定树中的结点数介于 1 和 100 之间
每个结点都有一个从 0 到 1000 范围内的唯一整数值
【示例】
输入:[5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]右单支树
【代码】中序遍历 递归法
执行用时 :0 ms, 在所有 C++ 提交中击败了100.00% 的用户
内存消耗 :6.9 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode*rs=NULL,*node=NULL;
TreeNode* increasingBST(TreeNode* root) {
if(root==NULL)
return NULL;
increasingBST(root->left);
if(rs==NULL)
rs=node=root;
else{
node->right=root;
node->left=NULL;
node=root;
}
increasingBST(root->right);
return rs;
}
};
【迭代法实现中序遍历】性能没有递归法高
执行用时 :4 ms, 在所有 C++ 提交中击败了73.91% 的用户
内存消耗 :7.1 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
stack<TreeNode*> s;
TreeNode* increasingBST(TreeNode* root) {
TreeNode *rs=NULL,*h=NULL;
while(root||!s.empty()){
while(root){
s.push(root);
root=root->left;
}
if(!s.empty()){
root=s.top();
if(rs==NULL){
rs=h=root;
}else{
h->right=root;
h->left=NULL;
h=root;
}
s.pop();
root=root->right;
}
}
return rs;
}
};