您的位置:首页 > 其它

leetcode_99_Recover Binary Search Tree

2015-03-29 11:06 483 查看

描述:

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
\
5

The 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;

}
}

结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: