• 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;
        }
    }
    
  • 相关阅读:
    POJ 2942 圆桌骑士 (点双学习笔记)
    洛谷P3563 POI Polarization
    通过集群的方式解决基于MQTT协议的RabbitMQ消息收发
    在WebAPI中调用其他WebAPI
    将WebAPI发布到本地服务器与远程服务器
    利用RabbitMQ、MySQL实现超大用户级别的消息在/离线收发
    C#程序调用cmd.exe执行命令
    C#调用python
    Trixbox下SIP TRUNK的基本设定
    连接两台asterisk服务器
  • 原文地址:https://www.cnblogs.com/mapoos/p/14593507.html
Copyright © 2020-2023  润新知