描述:
Two 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?
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.
思路:
首先中序遍历二叉查找树并将遍历的节点存储到一个list中,然后对list中的值进行比较,查找出位置出现变化的两个结点,将两个结点的值进行互换,完成本题的要求。
但是呢,对于如何发现位置出现变化的两个结点是本题的重点和难点,具体判断条件可以参见下面的程序,最后对查到的结点进行取舍也是一大问题,一般符合判断条件的结点会出现三个,我取的是第一个和第三个,这不好讲清楚,具体可自行推敲。
代码:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void recoverTree(TreeNode root) {
List<TreeNode>list=new ArrayList<TreeNode>();
if(root==null)
return;
Stack<TreeNode>st=new Stack<TreeNode>();
st.push(root);
TreeNode top=null;
while(!st.empty())
{
top=st.peek();
while(top.left!=null)
{
st.push(top.left);
top=top.left;
}
while(top.right==null)
{
list.add(top);
st.pop();
if(!st.empty())
top=st.peek();
else
break;
}
if(!st.empty())
{
list.add(top);
st.pop();
st.push(top.right);
}
}
int len=list.size()-1;
List<Integer>indexList=new ArrayList<Integer>();
if(list.get(0).val>list.get(1).val)
indexList.add(0);
for(int i=1;i<len;i++)
{
if(list.get(i).val<list.get(i-1).val||list.get(i).val>list.get(i+1).val)
indexList.add(i);
}
if(list.get(len).val<list.get(len-1).val)
indexList.add(len);
TreeNode node1=list.get(indexList.get(0));
TreeNode node2=list.get(indexList.get(indexList.size()-1));
int temp=node1.val;
node1.val=node2.val;
node2.val=temp;
}
}