leetcode 1457. 二叉樹中的僞迴文路徑(C++)

給你一棵二叉樹,每個節點的值爲 1 到 9 。我們稱二叉樹中的一條路徑是 「僞迴文」的,當它滿足:路徑經過的所有節點值的排列中,存在一個迴文序列。

請你返回從根到葉子節點的所有路徑中 僞迴文 路徑的數目。

 

示例 1:

輸入:root = [2,3,1,3,1,null,1]
輸出:2 
解釋:上圖爲給定的二叉樹。總共有 3 條從根到葉子的路徑:紅色路徑 [2,3,3] ,綠色路徑 [2,1,1] 和路徑 [2,3,1] 。
     在這些路徑中,只有紅色和綠色的路徑是僞迴文路徑,因爲紅色路徑 [2,3,3] 存在迴文排列 [3,2,3] ,綠色路徑 [2,1,1] 存在迴文排列 [1,2,1] 。

示例 2:

輸入:root = [2,1,1,1,3,null,null,null,null,null,1]
輸出:1 
解釋:上圖爲給定二叉樹。總共有 3 條從根到葉子的路徑:綠色路徑 [2,1,1] ,路徑 [2,1,3,1] 和路徑 [2,1] 。
     這些路徑中只有綠色路徑是僞迴文路徑,因爲 [2,1,1] 存在迴文排列 [1,2,1] 。

示例 3:

輸入:root = [9]
輸出:1

 

提示:

  • 給定二叉樹的節點數目在 1 到 10^5 之間。
  • 節點值在 1 到 9 之間。

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
	int ans=0;
	vector<vector<int>> res;

	void dfs(TreeNode* root, vector<int> tmp)
	{
		if(root)
		{
			tmp.push_back(root->val);
			if(root->left==NULL && root->right==NULL)
			{
				res.push_back(tmp);
			}
			else
			{
				dfs(root->left,tmp);
				dfs(root->right,tmp);
			}
		}
	}

    int pseudoPalindromicPaths (TreeNode* root) 
    {
        vector<int> tmp;
        dfs(root,tmp);
        for(auto v:res)
        {
        	map<int,int> m;
        	for(auto it:v)
        	{
        		m[it]++;
        	}
        	int count=0;
        	for(auto it:m)
        	{
        		if(it.second%2==1)
        		{
        			count++;
        		}
        	}
        	if(count<=1)
        	{
        		ans++;
        	}
        }
        return ans;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章