题目描述
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
提示:
- 给定树中的结点数介于 1 和 100 之间。
- 每个结点都有一个从 0 到 1000 范围内的唯一整数值。
解法1:中序遍历再重建树
先按照中序遍历存储节点(较简单),再按照题目要求重新建树。
代码如下:
class Solution {
public:
void getVec(TreeNode* root, vector<int>& nodes)
{
if(root == NULL) return;
if(root->left != NULL) getVec(root->left, nodes);
nodes.push_back(root->val);
if(root->right != NULL) getVec(root->right, nodes);
}
TreeNode* increasingBST(TreeNode* root) {
vector<int> nodes;
getVec(root, nodes);
if(nodes.size() <= 1) return root;
TreeNode* res = new TreeNode(nodes[0]);
TreeNode* head = res;
for(int i=1; i<nodes.size(); i++) {
TreeNode * tmp = new TreeNode(nodes[i]);
head->right = tmp;
head = tmp;
}
return res;
}
};
解法2:递归解法
这种解法较难,需要增加指针。
TreeNode* Solution::increasingBST(TreeNode* root)
{
return _increasingBST(root, NULL);
}
TreeNode* Solution::_increasingBST(struct TreeNode* root, struct TreeNode* pre)
{
if (!root)
{
return pre;
}
struct TreeNode* tmp = _increasingBST(root->left, root);
root->left = NULL;
root->right = _increasingBST(root->right, pre);
return tmp;
}
来源:CSDN
作者:Miss just
链接:https://blog.csdn.net/Missjust/article/details/104050436