文章目录
- 1.题目
- 2.代码
1.题目
- 题目要求
- eg:
Input: [3,1,4,null,null,2]
3
/ \
1 4
/
2
Output: [2,1,4,null,null,3]
2
/ \
1 4
/
3
- 思路:
结果数组是中序遍历的结果,这道题要求我们复原一个二叉搜索树,说是其中有两个的顺序被调换了,题目要求上说 O(n) 的解法很直观,这种解法需要用到递归,用中序遍历树,并将所有节点存到一个一维向量中,把所有节点值存到另一个一维向量中,然后对存节点值的一维向量排序,在将排好的数组按顺序赋给节点。
2.代码
复杂问题直接使用递归
class Solution{
public:
void recoverTree(TreeNode* root)
{
vector<TreeNode*> all_node;
vector<int> all_node_val;
inorder(all_node, all_node_val, root);
sort(all_node_val.begin(),all_node_val.end());
for (int i=0;i<all_node.size();++i)
all_node[i]->val=all_node_val[i];
}
void inorder(vector<TreeNode*>& all_node, vector<int> all_node_val, TreeNode* root)
{
if (!root) return;
inorder(all_node,all_node_val,root->left);
all_node.push_back(root);
all_node_val.push_back(root->val);
inorder(all_node,all_node_val,root->right);
}
};