971. 翻转二叉树以匹配先序遍历
题目看了半天没看懂,官网解答也看的迷迷糊糊,发现一个大神只有29行代码的解答,反而让我豁然开朗,特意记录一下题目过程。
分析
要求二叉树的先序遍历和voyage序列匹配,如果不匹配是允许旋转子树的,但这个旋转只是交换左子节点和右子节点的位置,不是真正的全部翻转,就如例子里的,2和3互换了位置,4和5没有互换位置,这里的互换相当于搜索顺序变一下。
因此,题目可以这么分析:
(1)二叉树的先序遍历,并记录到voyage的那个元素了,对值进行对比。
(2)如果当前元素不相等,已经无法旋转了,直接返回-1
(3)如果当前元素相等,后一个元素不相等,则需要旋转(即先遍历右子树,再遍历左子树)
List<Integer> result = new ArrayList<>();
int index = 0;
public List<Integer> flipMatchVoyage(TreeNode root, int[] voyage) {
if (dfs(root, voyage)) {
return result;
}
return Arrays.asList(-1);
}
public boolean dfs(TreeNode root, int[] voyage) {
if (root == null) {
return true;
}
if (root.val != voyage[index++]) {
return false;
}
if (root.left != null && root.left.val != voyage[index]) {
result.add(root.val);
return dfs(root.right, voyage) && dfs(root.left, voyage);
}
return dfs(root.left, voyage) && dfs(root.right, voyage);
}