Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:
confused what "{1,#,2,3}"
means? >
read more on how binary tree is serialized on OJ.
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; } }
leetcode_99_Recover Binary Search Tree
原文地址:http://blog.csdn.net/mnmlist/article/details/44725265