恢复二叉搜索树
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
输入: [1,3,null,null,2]
1
/
3
\
2
输出: [3,1,null,null,2]
3
/
1
\
2
思路+代码+注释:
public void recoverTree(TreeNode root) {
/*
思路:
中序遍历:左根右
中序遍历树中的节点,将节点添加到一个数组中,再将节点的值添加到另一个数组中,对节点值的数组
从小到大进行排序,在将排序后节点的值赋给原来的节点
*/
List<TreeNode> nodeList=new ArrayList<>();
midSort(root,nodeList);
int[] nodes=new int[nodeList.size()];
for (int i = 0; i < nodeList.size(); i++) {
nodes[i]=nodeList.get(i).val;
}
Arrays.sort(nodes);
for (int i = 0; i < nodeList.size(); i++) {
nodeList.get(i).val=nodes[i];
}
}
private void midSort(TreeNode root, List<TreeNode> nodeList)
{
if (root==null)
{
return;
}
midSort(root.left,nodeList);
nodeList.add(root);
midSort(root.right,nodeList);
}