https://leetcode.com/problems/flip-binary-tree-to-match-preorder-traversal/
分析:题目要求,如何通过swap左右节点的方式,得到固定的前序遍历的数组
周赛题目:week118
解法:这种题目,直接dfs就好,当然也可以用一个stack来迭代;唯一需要考虑的是left为空,是preorder是直接遍历right的,这种情况不需要swap;
复杂度分析:每个节点
时间复杂度:O(n),n为节点数量
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int i = 0;
private List<Integer> res = new ArrayList<>();
public List<Integer> flipMatchVoyage(TreeNode root, int[] voyage) {
if (dfs(root, voyage)) return res;
res.clear();
res.add(-1);
return res;
}
public boolean dfs(TreeNode r, int[] v) {
if (r == null) return true;
if (r.val != v[i++]) return false;
if (r.left != null && r.left.val == v[i]) {
return dfs(r.left, v) && dfs(r.right, v);
}else if (r.right != null && r.right.val == v[i]) {
// 前序遍历时,左子树为空,会直接遍历右子树,这种情况不用swap
if (r.left != null) {
// 只有left不为空,才会swap
res.add(r.val);
}
return dfs(r.right, v) && dfs(r.left, v);
}
// 前两种都没有匹配,必须当前节点是leaf才可以满足要求
return r.left == null && r.right == null;
}
}