99.恢复二叉搜索树

recover-binary-search-tree

题目描述

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:
99.恢复二叉搜索树_第1张图片
示例 2:
99.恢复二叉搜索树_第2张图片

代码
package pid99;

import java.util.List;
import java.util.ArrayList;

public class Solution {
	public void recoverTree(TreeNode root){
		if(root == null){
			return;
		}
		List<Integer> nodeList = new ArrayList<>();
		inorder(root.left,nodeList);
		nodeList.add(root.val);
		inorder(root.right,nodeList);
		
		int[] twoNums = findTwoFaultyNums(nodeList);
		int first = twoNums[0];
		int second = twoNums[1];
		recover(first,second,root);
	}
	
	public void inorder(TreeNode root,List<Integer> nodeList){
		if(root == null){
			return;
		}
		inorder(root.left,nodeList);
		nodeList.add(root.val);
		inorder(root.right,nodeList);
	}
	
	public int[] findTwoFaultyNums(List<Integer> nodeList){
		int first = -1;
		int second = -1;	
		for(int i=0;i<nodeList.size()-1;i++){
			if(nodeList.get(i) > nodeList.get(i+1)){
				second = nodeList.get(i+1);
				if(first == -1){
					first = nodeList.get(i);
				}else{
					break;
				}
			}
		}
		return new int[]{first,second};
	}
	
	public void recover(int first,int second,TreeNode root){
		if(root == null){
			return;
		}
		if(root.val == first){
			root.val = second;
		}else if(root.val == second){
			root.val = first;
		}
		recover(first,second,root.left);
		recover(first,second,root.right);
	}
}
性能表现

99.恢复二叉搜索树_第3张图片

心得

今天花了很长时间解出来的一道Hard题,第一遍基本已经做出来了,不过对于交换结点纠结了半天,其实只需要将两个位置上结点的val值交换即可,我想复杂了。
看了遍题解,和我的思路基本一致,不过我自己的代码已经删掉了,所以只能重写。
重写过程中也参考了题解比较优秀的一些处理,比如将nodeList作为参数传入以进行递归,而不是声明为类的成员变量;那个recover递归函数思路很巧妙,所以也搬运过来了。

你可能感兴趣的:(leetcode)