971. 翻转二叉树以匹配先序遍历

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了971. 翻转二叉树以匹配先序遍历相关的知识,希望对你有一定的参考价值。

971. 翻转二叉树以匹配先序遍历

 


题目

传送门:https://leetcode.cn/problems/flip-binary-tree-to-match-preorder-traversal/

 


算法设计:深度优先搜索

先序遍历一棵树,若不符合,则尝试交换左右子树,若还是不符合,返回-1;

注意:若树中存在相同结点值,这种方法是行不通的,不过题目说了,结点值不相同。

class Solution 
    vector<int> res;       // 全局变量存结果
    int i = 0;             // 全局索引比较方便
public:
    vector<int> flipMatchVoyage(TreeNode* root, vector<int>& v) 
        // 若可通过交换来满足预期,返回交换的结点值
        if(dfs(root, v))
            return res;
        return vector<int>-1;
    

    bool dfs(TreeNode* node, vector<int>& v) 
        if (!node) return true;
        if (node->val != v[i++]) return false;       // 若当前结点不符合预期,不符合
        if (node->left && node->left->val != v[i])  // 若先序遍历结果与预期不符,则尝试返回交换后的遍历结果
            res.push_back(node->val);                // 记录这次交换
            return dfs(node->right, v) && dfs(node->left, v); // 交换
        
        return dfs(node->left, v) && dfs(node->right, v);
    
;

以上是关于971. 翻转二叉树以匹配先序遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的递归遍历

二叉树遍历

二叉树先序遍历C语言实现

二叉树遍历的递归实现(先序中序后序和层次遍历)

二叉树的递归遍历(先序中序和后序)

二叉树先序遍历c#版本