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;
        }
    }
    
  • 相关阅读:
    LeetCode: Copy List with Random Pointer
    LeetCode: Clone Graph
    LeetCode: Candy
    Database: Normal form
    Algorithm: cartesian tree
    【阿里云产品公测】云引擎ACE初体验
    【阿里云产品公测】Opensearch使用体验和评测
    【阿里云产品公测】阿里云OpenSearch初次使用评测
    【阿里云产品公测】OpenSearch初探
    【阿里云产品公测】弹性伸缩服务ESS之试用初体验
  • 原文地址:https://www.cnblogs.com/mapoos/p/14593507.html
Copyright © 2011-2022 走看看