C++ program to remove Nodes that Don't Lie in Any Path With Sum>=k

In this problem, we have a binary tree with a path from the root node to the leaf node that is completely defined. The sum of all nodes from the root node to the leaf node must be greater than or equal to, a constant value, k. So we need to remove all nodes in those paths whose sum is less than k, such that the only paths left in the tree will be greater than k. An important thing to remember here is that a node may be a part of many paths, so only remove such nodes if all the paths leading to that node have a sum < k.

From the root node to the leaf node, we can calculate the sum. When the recursive call completes for a node and control returns, we can check if the sum is < k for both left and right paths. If the sum is less than k for both the left and right paths, we need to remove this node.

Let's suppose we have 150 K and a tree like this ?

<span class="pln">                  </span><span class="lit">10</span><span class="pln">
                  </span><span class="pun">/</span><span class="pln">\
                 </span><span class="lit">20</span><span class="pln"> </span><span class="lit">30</span><span class="pln">
                </span><span class="pun">/</span><span class="pln">\   </span><span class="pun">/</span><span class="pln">\
              </span><span class="lit">5</span><span class="pln">  </span><span class="lit">35</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> </span><span class="lit">45</span><span class="pln">
                 </span><span class="pun">/</span><span class="pln">\     </span><span class="pun">/</span><span class="pln">\
               </span><span class="lit">50</span><span class="pln">  </span><span class="lit">55</span><span class="pln"> </span><span class="lit">60</span><span class="pln">  </span><span class="lit">65</span><span class="pln">
                   </span><span class="pun">/</span><span class="pln">\  </span><span class="pun">/</span><span class="pln">  </span><span class="pun">/</span><span class="pln">
                 </span><span class="lit">70</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">90</span><span class="pln"> </span><span class="lit">100</span>

If we see that the path root->left->left has a sum of 10 + 20 + 5, which is 25, less than 150, we need to prune it and remove 5. After this, let's evaluate 10->30->40. It's less than 150, so remove 40.

Now we see another path 10->20->35->50 and the total sum 115 which is less than 150, so we remove 50. Now the remaining paths we have are

10->20->35->55->70 ;
10->20->35->55->80 ;
10->30->45->60->90 ;
10->30->45->65->100 ;

The sum of all paths is greater than 150, so we don't need to prune anymore.

Example

Following is a C++ program demonstrating how to remove nodes that don't lie in any path whose sum is greater than or equal to any constant value k ?

<div class="execute"></div><div class="code-mirror  language-cpp" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">Node</span> <span class="token punctuation">{</span>
   <span class="token keyword">public</span><span class="token operator">:</span>
   <span class="token keyword">int</span> value<span class="token punctuation">;</span>
   Node <span class="token operator">*</span>left<span class="token punctuation">,</span> <span class="token operator">*</span>right<span class="token punctuation">;</span>
   <span class="token function">Node</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token operator">-></span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
      left <span class="token operator">=</span> right <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
Node<span class="token operator">*</span> <span class="token function">removeNodesWithPathSumLessThanK</span><span class="token punctuation">(</span>Node<span class="token operator">*</span> root<span class="token punctuation">,</span> <span class="token keyword">int</span> k<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">&</span> sum<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword">if</span><span class="token punctuation">(</span>root <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> leftSum<span class="token punctuation">,</span> rightSum<span class="token punctuation">;</span>
   leftSum <span class="token operator">=</span> rightSum <span class="token operator">=</span> sum <span class="token operator">+</span> root<span class="token operator">-></span>value<span class="token punctuation">;</span>
   root<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token function">removeNodesWithPathSumLessThanK</span><span class="token punctuation">(</span>root<span class="token operator">-></span>left<span class="token punctuation">,</span> k<span class="token punctuation">,</span> leftSum<span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token function">removeNodesWithPathSumLessThanK</span><span class="token punctuation">(</span>root<span class="token operator">-></span>right<span class="token punctuation">,</span> k<span class="token punctuation">,</span> rightSum<span class="token punctuation">)</span><span class="token punctuation">;</span>
   sum <span class="token operator">=</span> <span class="token function">max</span><span class="token punctuation">(</span>leftSum<span class="token punctuation">,</span> rightSum<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">if</span><span class="token punctuation">(</span>sum <span class="token operator"><</span> k<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token function">free</span><span class="token punctuation">(</span>root<span class="token punctuation">)</span><span class="token punctuation">;</span>
      root <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">return</span> root<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">printInorderTree</span><span class="token punctuation">(</span>Node<span class="token operator">*</span> root<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword">if</span><span class="token punctuation">(</span>root<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token function">printInorderTree</span><span class="token punctuation">(</span>root<span class="token operator">-></span>left<span class="token punctuation">)</span><span class="token punctuation">;</span>
      cout <span class="token operator"><<</span> root<span class="token operator">-></span>value <span class="token operator"><<</span> <span class="token string">" "</span><span class="token punctuation">;</span>
      <span class="token function">printInorderTree</span><span class="token punctuation">(</span>root<span class="token operator">-></span>right<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">150</span><span class="token punctuation">;</span>
   Node<span class="token operator">*</span> root <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">35</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">40</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">45</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">55</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">60</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">65</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">70</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>left<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">80</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">90</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   root<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> sum <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token string">"Inorder tree before: "</span><span class="token punctuation">;</span>
   <span class="token function">printInorderTree</span><span class="token punctuation">(</span>root<span class="token punctuation">)</span><span class="token punctuation">;</span>
   root <span class="token operator">=</span> <span class="token function">removeNodesWithPathSumLessThanK</span><span class="token punctuation">(</span>root<span class="token punctuation">,</span> k<span class="token punctuation">,</span> sum<span class="token punctuation">)</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token string">"\nInorder tree after: "</span><span class="token punctuation">;</span>
   <span class="token function">printInorderTree</span><span class="token punctuation">(</span>root<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

Inorder tree before: 5 20 50 35 70 55 80 10 40 30 90 60 45 100 65 
Inorder tree after: 20 35 70 55 80 10 30 90 60 45 100 65 

Tree after we pruned it completely ?

<span class="pln">                  </span><span class="lit">10</span><span class="pln">
                  </span><span class="pun">/</span><span class="pln"> \
                 </span><span class="lit">20</span><span class="pln">  </span><span class="lit">30</span><span class="pln">
                 \     \
                 </span><span class="lit">35</span><span class="pln">     </span><span class="lit">45</span><span class="pln">
                  \     </span><span class="pun">/</span><span class="pln">\
                  </span><span class="lit">55</span><span class="pln">   </span><span class="lit">60</span><span class="pln"> </span><span class="lit">65</span><span class="pln">
                  </span><span class="pun">/</span><span class="pln">\    </span><span class="pun">/</span><span class="pln">  </span><span class="pun">/</span><span class="pln">
                 </span><span class="lit">70</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">90</span><span class="pln"> </span><span class="lit">100</span>

Conclusion

As we can see that after the initial observation, we can apply the DFS and remove nodes as our recursive function returns from each call by computing the sum at that node. Overall a simple observational and methodological problem.

Updated on: 2022-08-10T07:27:18+05:30

250 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements