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;
        }
    }
    
  • 相关阅读:
    简体中文和繁体中文的转换
    EasyPoi 快速Office 开发
    玩转SpringBoot之定时任务详解
    Spring Boot中使用Swagger2构建强大的RESTful API文档
    一篇文章带你搞懂 SpringBoot与Swagger整合
    JAVA团队开发手册
    CentOS(6、7)修改主机名(hostname)
    SpringBoot多环境部署,在启动时动态设置相应的配置文件
    MyBatis逆向工程代码的生成以及使用详解(持续更新)
    MySQL写入插入数据优化配置
  • 原文地址:https://www.cnblogs.com/mapoos/p/14593507.html
Copyright © 2011-2022 走看看