题目描述
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
提示:
- 给定树中的结点数介于 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;
}
本文介绍了一种树的数据结构操作方法,通过中序遍历将树重新排列,使得最左侧节点成为新树的根节点,每个节点仅保留右子节点。提供了两种解法,一种是先进行中序遍历存储节点,再根据结果重建树;另一种是使用递归解法,通过增加指针来实现。适用于1到100个节点的树,每个节点包含0到1000范围内的唯一整数值。
537

被折叠的 条评论
为什么被折叠?



