C++ 中二叉樹的偽迴文路徑


假設我們有一棵二叉樹,其中節點值是 1 到 9 的數字。當二叉樹中的一條路徑的節點值的至少一種排列是迴文時,則稱該路徑為偽迴文路徑。我們必須找到從根節點到葉節點的偽迴文路徑的數量。

因此,如果輸入類似於

則輸出將為 2,這是因為有三條路徑從根節點到葉節點 - 紅色路徑遵循 [2,3,3],綠色路徑遵循 [2,1,1],以及路徑 [2,3,1]。在這些路徑中,只有紅色路徑和綠色路徑是偽迴文路徑,因為紅色路徑 [2,3,3] 可以重新排列為 [3,2,3],而綠色路徑 [2,1,1] 可以重新排列為 [1,2,1]。

為了解決這個問題,我們將遵循以下步驟 -

  • 定義一個函式 ok(),它將接收一個數組 v,

  • odd := 0

  • 對於 v 中的每個元素 it -

    • odd := odd + it AND 1

  • 當 odd 為 0 或 1 時返回 true,否則返回 false

  • 定義一個函式 dfs(),它將接收節點和陣列 v,

  • 如果節點為空,則 -

    • 返回

  • 將 v[節點的值] 增加 1

  • 如果節點的左子節點和右子節點都為空,則 -

    • 如果 ok(v) 為真,則 -

      • (將 ret 增加 1)

    • 將 v[節點的值] 減少 1

    • 返回

  • dfs(節點的左子節點, v)

  • dfs(節點的右子節點, v)

  • 將 v[節點的值] 減少 1

  • 從主方法中執行以下操作 -

  • ret := 0

  • 定義一個大小為 10 的陣列 cnt

  • dfs(根節點, cnt)

  • 返回 ret

示例

讓我們看一下以下實現以更好地理解 -

即時演示

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = NULL;
      right = NULL;
   }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      }
      else{
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         return;
      }
      else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int> v){
   TreeNode *root = new TreeNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
class Solution {
public:
   int ret;
   bool ok(vector <int>& v){
      int odd = 0;
      for (auto& it : v) {
         odd += it & 1;
      }
      return odd == 0 || odd == 1;
   }
   void dfs(TreeNode* node, vector <int>& v){
      if (!node)
         return;
      v[node->val]++;
      if (!node->left && !node->right) {
         if (ok(v))
            ret++;
         v[node->val]--;
         return;
      }
      dfs(node->left, v);
      dfs(node->right, v);
      v[node->val]--;
   }
   int pseudoPalindromicPaths (TreeNode* root) {
      ret = 0;
      vector<int> cnt(10);
      dfs(root, cnt);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {2,3,1,3,1,NULL,1};
   TreeNode *root = make_tree(v);
   cout << (ob.pseudoPalindromicPaths(root));
}

輸入

{2,3,1,3,1,NULL,1}

輸出

2

更新於: 2020年11月18日

254 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告