一、问题描述
wo elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:A solution using O( n ) space is pretty straight forward. Could you devise a constant space solution?
二、问题分析
利用树的中序遍历算法leetcode:Binary Tree Inorder Traversal 【Java】。
三、算法代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void recoverTree(TreeNode root) {
//以下是中序遍历
if(root==null) return;
List<TreeNode> result = new ArrayList<TreeNode>();
Stack<TreeNode> stack = new Stack<TreeNode>();
HashSet<TreeNode> visitedSet = new HashSet<TreeNode>(); //已遍历过的节点不再遍历
stack.push(root);
while(!stack.empty()) {
TreeNode cur = stack.peek();
while(cur.left != null && !visitedSet.contains(cur.left)){
stack.push(cur.left);
cur = cur.left;
}
result.add(cur);
visitedSet.add(cur);
stack.pop();
if(cur.right != null){
stack.push(cur.right);
}
}
//调整元素
List<Integer> inorderNumbers = new ArrayList<Integer>();
for (TreeNode node : result) {
inorderNumbers.add(node.val);
}
inorderNumbers.sort(null);
for (int i = 0; i < result.size(); i++) {
result.get(i).val = inorderNumbers.get(i);
}
}
}