题目链接:971. Flip Binary Tree To Match Preorder Traversal
概述
这个题目给定了一棵有N
个节点的二叉树以及一个序列v
,问如何翻转最少的节点(交换左右子树),使得前序遍历结果和给定的序列一致。
思路
使用DFS
前序遍历这棵树,并且使用一个指针i
,记录当前节点node
应该和v
中的哪个值相等,DFS
时,可分为以下三种情况:
node === null
,说明我们已经遍历完了,返回true
node.val !== v[i]
,说明该节点值不是预期的,返回false
node.left.!== null && node.left.val !== v[i]
,说明左儿子存在但是其值并不是预期的,此时,我们应该翻转node
节点,但是我们并不需要真的去修改指针,只要先去遍历右子树,再去遍历左子树,即可达到翻转并且前序遍历的目的。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
var flipMatchVoyage = function(root, voyage) { var result = []; var i = 0; var dfs = function(node){ if(node == null){ return true; } if(node.val != voyage[i++]){ return false; } if(node.left != null && node.left.val != voyage[i]){ result.push(node.val); return dfs(node.right) && dfs(node.left); } return dfs(node.left) && dfs(node.right); } return dfs(root) ? result : [-1]; };
|
题解合集