给定一个二叉排序树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
样例
样例 1:
输入:root = {5,3,6,2,4,#,8,1,#,#,#,7,9}
5
/ \
3 6
/ \ \
2 4 8
/ / \
1 7 9
输出:{1,#,2,#,3,#,4,#,5,#,6,#,7,#,8,#,9}
解释:
1
\
2
\
3
\
4
\
5
\
6
\
7
\
8
\
9
样例 2:
输入: root = {8,3,10,1,6,#,14,#,#,4,7,13,#}
8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13
输出: {1,#,3,#,4,#,6,#,7,#,8,#,10,#,13,#,14}
解释:
1
\
3
\
4
\
6
\
7
\
8
\
10
\
13
\
14
注意事项
- 给定树中的结点数介于 1 和 100 之间。
- 每个结点都有一个从 0 到 1000 范围内的唯一整数值。
输入测试数据 (每行一个参数)如何理解测试数据?
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: a binary search tree
* @return: Root of a tree
*/
vector<int> nums;
TreeNode * increasingBST(TreeNode * root) {
// Write your code here.
bianli(root);
TreeNode* ret = NULL;
TreeNode* tail = NULL;
for(int i = 0; i < nums.size(); i++)
{
TreeNode* tmp = new TreeNode(nums[i]);
if(ret == NULL)
{
ret = tmp;
tail = tmp;
}
else
{
tail->right = tmp;
tail = tmp;
}
}
return ret;
}
void bianli(TreeNode* root)
{
if(root != NULL)
{
bianli(root->left);
nums.push_back(root->val);
bianli(root->right);
}
}
};