通过翻转二叉树的一些节点,使得前序遍历为v数组
一些优雅的解答
递归写法:
List<Integer> res = new ArrayList<>();
int i = 0;
public List<Integer> flipMatchVoyage(TreeNode root, int[] v) {
return dfs(root, v) ? res : Arrays.asList(-1);
}
private boolean dfs(TreeNode root, int[] v) {
if (root == null) return true;
if (root.val != v[i++]) return false;
if (root.left != null && root.left.val != v[i]) {
res.add(root.val);
return dfs(root.right, v) && dfs(root.left, v);
}
return dfs(root.left, v) && dfs(root.right, v);
}
迭代版:
public List<Integer> flipMatchVoyage(TreeNode root, int[] v) {
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
int i = 0;
List<Integer> res = new LinkedList<>();
while (!stack.isEmpty()) {
TreeNode poll = stack.pop();
if (poll == null) continue;
if (poll.val != v[i++]) return Arrays.asList(-1);
if (poll.right != null && poll.right.val == v[i]) {
if (poll.left != null) res.add(poll.val);
stack.add(poll.left);
stack.add(poll.right);
} else {
stack.add(poll.right);
stack.add(poll.left);
}
}
return res;
}