跳到主要内容

971.翻转二叉树以匹配先序遍历

链接:971.翻转二叉树以匹配先序遍历
难度:Medium
标签:树、深度优先搜索、二叉树
简介:请翻转 最少 的树中节点,使二叉树的 先序遍历 与预期的遍历行程 voyage 相匹配 。 。

题解 1 - typescript

  • 编辑时间:2021-08-14
  • 执行用时:84ms
  • 内存消耗:39.5MB
  • 编程语言:typescript
  • 解法介绍:dfs。
function flipMatchVoyage(root: TreeNode | null, voyage: number[]): number[] {
if (root === null) return [];
const ans: number[] = [];
let stop = false;
dfs(root, voyage);
return stop ? [-1] : ans;
function dfs(node: TreeNode, voyage: number[]) {
if (stop) return;
const val = node.val;
const n = voyage.length;
if (val !== voyage[0]) {
stop = true;
return;
}
if (node.left === null && node.right === null) {
if (!(n === 1 && voyage[0] === val)) stop = true;
return;
}
if (node.left === null) {
if (voyage[1] !== node.right!.val) stop = true;
else dfs(node.right!, voyage.slice(1));
return;
}
if (node.right === null) {
if (voyage[1] !== node.left!.val) stop = true;
else dfs(node.left!, voyage.slice(1));
return;
}
const valL = node.left!.val;
const valR = node.right!.val;
if (voyage[1] === valL) {
let idx = 1;
while (idx < n && voyage[idx] !== valR) idx++;
dfs(node.left!, voyage.slice(1, idx));
dfs(node.right!, voyage.slice(idx));
} else {
let idx = 1;
while (idx < n && voyage[idx] !== valL) idx++;
dfs(node.right!, voyage.slice(1, idx));
dfs(node.left!, voyage.slice(idx));
ans.push(val);
}
}
}