1. 思路
中序遍历,找出其中不符合规律的节点,交换。
2. 实现
2.1 递归
当然,这样并不能符合常量空间的要求。
class Solution { TreeNode first = null, second = null, pre = new TreeNode(Integer.MIN_VALUE); public void recoverTree(TreeNode root) { traverse(root); int temp = first.val; //注意,这里是值,而不是节点。否则仅仅改变节点的引用,并不能真正改变节点。下同。 first.val = second.val; second.val = temp; } public void traverse(TreeNode root){ //中序遍历,递归,找出不符合规律的两个节点。当然这样并不能满足常量空间的要求。 if(root == null){ return; } traverse(root.left); if(first==null && pre.val>=root.val){ first = pre; //此时,应该是前面的那个节点错了 } if(first!=null && pre.val>=root.val){ second = root; //写个例子,自然就看出来了 } pre = root; traverse(root.right); } }
2.2 Mirrors trasversal
常量空间。
class Solution { public void recoverTree(TreeNode root) { TreeNode pre=null, node=root; TreeNode first=null, second=null; TreeNode temp=null; while(node!=null){ if(node.left==null){ if(pre!=null && pre.val>=node.val){ if(first==null){ first = pre; } second = node; //这里和上一段程序中形式上不太一样,其实流程、效果都是相同的。 } pre = node; node = node.right; }else{ temp = node.left; while(temp.right!=null && temp.right!=node){ temp = temp.right; } if(temp.right == null){ temp.right = node; node = node.left; }else{ if(pre!=null && pre.val>=node.val){ if(first==null){ first = pre; } second = node; } pre = node; temp.right = null; node = node.right; } } } if(first!=null && second!=null){ int t = first.val; first.val = second.val; second.val = t; } } }