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 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告