zoukankan      html  css  js  c++  java
  • 0971. Flip Binary Tree To Match Preorder Traversal (M)

    Flip Binary Tree To Match Preorder Traversal (M)

    题目

    You are given the root of a binary tree with n nodes, where each node is uniquely assigned a value from 1 to n. You are also given a sequence of n values voyage, which is the desired pre-order traversal of the binary tree.

    Any node in the binary tree can be flipped by swapping its left and right subtrees. For example, flipping node 1 will have the following effect:

    Flip the smallest number of nodes so that the pre-order traversal of the tree matches voyage.

    Return a list of the values of all flipped nodes. You may return the answer in any order. If it is impossible to flip the nodes in the tree to make the pre-order traversal match voyage, return the list [-1].

    Example 1:

    Input: root = [1,2], voyage = [2,1]
    Output: [-1]
    Explanation: It is impossible to flip the nodes such that the pre-order traversal matches voyage.
    

    Example 2:

    Input: root = [1,2,3], voyage = [1,3,2]
    Output: [1]
    Explanation: Flipping node 1 swaps nodes 2 and 3, so the pre-order traversal matches voyage.
    

    Example 3:

    Input: root = [1,2,3], voyage = [1,2,3]
    Output: []
    Explanation: The tree's pre-order traversal already matches voyage, so no nodes need to be flipped.
    

    Constraints:

    • The number of nodes in the tree is n.
    • n == voyage.length
    • 1 <= n <= 100
    • 1 <= Node.val, voyage[i] <= n
    • All the values in the tree are unique.
    • All the values in voyage are unique.

    题意

    给定一个二叉树和一个前序遍历序列,可以交换二叉树中任意结点的两个子树,问能否通过交换子树来得到一个新树,使其前序遍历序列与给定的序列相同。

    思路

    DFS。


    代码实现

    Java

    class Solution {
        public List<Integer> flipMatchVoyage(TreeNode root, int[] voyage) {
            List<Integer> ans = new ArrayList<>();
            return dfs(root, voyage, 0, ans) != -1 ? ans : Arrays.asList(-1);
        }
    
      	// 返回下一个应该比较的下标
        private int dfs(TreeNode cur, int[] voyage, int idx, List<Integer> ans) {
            if (cur == null) return idx;
            if (cur.val != voyage[idx]) return -1;
    
            int nidx = dfs(cur.left, voyage, idx + 1, ans);
            if (nidx != -1) return dfs(cur.right, voyage, nidx, ans);
    
            ans.add(cur.val);		// 需要翻转
    
            nidx = dfs(cur.right, voyage, idx + 1, ans);
            if (nidx != -1) return dfs(cur.left, voyage, nidx, ans);
    
            return -1;
        }
    }
    
  • 相关阅读:
    UVALive2287 POJ1047 HDU1313 ZOJ1073 Round and Round We Go【大数+数学计算】
    HDU1559 最大子矩阵【DP】
    51Nod-1050 循环数组最大段和【最大子段和+最小子段和+DP】
    51Nod-1051 最大子矩阵和【最大子段和+DP】
    UVALive2288 POJ1050 HDU1081 ZOJ1074 To The Max【最大子段和+DP】
    UVALive2363 POJ1005 HDU1065 ZOJ1049 I Think I Need a Houseboat【数学计算】
    UVALive6050 Primes【素数筛选+前缀和】
    POJ3978 Primes【素数筛选+前缀和】
    sql里的多行多列转一行多列小技巧
    实体类作为另一个实体类的属性
  • 原文地址:https://www.cnblogs.com/mapoos/p/14593507.html
Copyright © 2011-2022 走看看