【树】B042_LC_翻转二叉树以匹配先序遍历(先序遍历)

一、Problem

给定一个有 N 个节点的二叉树,每个节点都有一个不同于其他节点且处于 {1, …, N} 中的值。通过交换节点的左子节点和右子节点,可以翻转该二叉树中的节点。

考虑从根节点开始的先序遍历报告的 N 值序列。将这一 N 值序列称为树的行程。

我们的目标是翻转最少的树中节点,以便树的行程与给定的行程 voyage 相匹配。 如果可以,则返回翻转的所有节点的值的列表。你可以按任何顺序返回答案。如果不能,则返回列表 [-1]。

在这里插入图片描述

输入:root = [1,2,3], voyage = [1,3,2]
输出:[1]

提示:

1 <= N <= 100

二、Solution

方法一:先序遍历

思路

题目比较难懂,说的其实是如果 voyage 数组就是一棵树预期的先序遍历,而我们要做到是遍历并检查 root 这棵树;

如果根匹配 voyage 的根,那么就检查根的下一个结点是否与 voyage 的下一个结点匹配;如果不匹配,返回 {-1},如果匹配,就需要交换,那么此时的该结点的行程就是该根结点的值

class Solution {
public:
	vector<int> tar, ans;
	int isMatch = 1, i;

	void dfs(TreeNode* root) {
		if (root == NULL || !isMatch)
			return;
		if (root->val != tar[i]) {
			isMatch = 0;
			return;
		}
		if (root->left != NULL && root->left->val != tar[i+1]) {
			swap(root->left, root->right);
			ans.push_back(root->val);
		}
        i++;
		dfs(root->left);
		dfs(root->right);
	}
    vector<int> flipMatchVoyage(TreeNode* root, vector<int>& voyage) {
    	tar = voyage;
    	dfs(root);
        if (!isMatch)
            return {-1};
    	return ans;
    }
};

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章