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;
        }
    }
    
  • 相关阅读:
    C# 普印力RFID打印机模板打印
    C# IP地址段端口扫描器封装调用
    W3100SMS 短信猫代码发送 下
    C#动态创建Access数据库,创建加密码Access数据库,更改Access密码
    C# 区分键盘和红外线扫描枪输入 模拟扫描枪
    文件格式大全
    winform获取当前Url地址
    [WPF]使用C#代码实现DataTemplate
    钩子类型
    WM_*
  • 原文地址:https://www.cnblogs.com/mapoos/p/14593507.html
Copyright © 2011-2022 走看看