在 C++ 中查找二叉树根节点到叶子节点路径中是否存在一对节点,其和等于根节点的值


在这个问题中,我们给定一棵二叉树。我们需要查找根节点到叶子节点路径中是否存在一对节点,其和等于根节点的值。

我们需要检查是否存在一对节点位于根节点到叶子节点的路径之间,使得这对节点的值之和等于根节点的值。

让我们举个例子来理解这个问题,

输入


输出:

解释:

根节点值为 7

和等于根节点值的节点对:(2, 5), (1, 6)。

解决方案:

我们需要遍历树并使用哈希表查找节点对。

为此,我们将创建一个哈希表并遍历树。将数据插入哈希表,然后检查它与其他元素的和是否等于根节点的值。

最后,如果我们没有找到任何节点对,则返回false。

如果找到节点对,则返回true。

程序演示了我们解决方案的工作原理,

示例

在线演示

#include<bits/stdc++.h>
using namespace std;

struct Node {
   
   int data;
   struct Node* left, *right;
};

struct Node* newnode(int data) {
   
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}

bool findSumUntill(Node *node, unordered_set<int> &amp;hashTable, int rootVal)
{
   if (node == NULL)
      return false;

   int otherVal = rootVal - node->data;
   if (hashTable.find(otherVal) != hashTable.end())
      return true;

   hashTable.insert(node->data);
   bool isFound = findSumUntill(node->left, hashTable, rootVal) || findSumUntill(node->right, hashTable, rootVal);
   hashTable.erase(node->data);

   return isFound;
}

bool findPairSum(Node *root) {
   
   unordered_set<int> hashTable;

   return findSumUntill(root->left, hashTable, root->data) || findSumUntill(root->right, hashTable, root->data);
}

int main()
{
   struct Node *root = newnode(7);
   root->left = newnode(2);
   root->right = newnode(3);
   root->left->left = newnode(5);
   root->left->right = newnode(9);
   root->left->left->left = newnode(1);
   root->left->left->right = newnode(6);
   root->right->left = newnode(8);
   
   if(findPairSum(root))
      cout<<"Pair with sum equal to root value found";
   else
      cout<<"No pairs found";
   return 0;
}

输出

Pair with sum equal to root value found

更新于: 2021年1月22日

73 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告