Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
Replace Each Node in Binary Tree With The Sum Of Its Inorder Predecessor And Successor Using C++
We are given a binary tree, and we need to replace all the elements with the sum of its inorder predecessor and successor. Inorder is a traversed path in a graph that reads in the order of left node - root node - right node. The method adds the elements in left and right nodes of the parent node and replaces the value with the obtained sum.
Suppose we have a tree with the following formation and characters ?

We can find and store the inorder of the tree in an array. After that, we can again do an inorder traversal, but we will replace the element with the indexes in our array this time.
Let us look at some input scenarios ?
Assume the input given as the nodes of binary tree reading, [3 8 15 7 10 3 6 4 9], and the resultant binary tree is obtained as ?
Input: [3 8 15 7 10 3 6 4 9] Result? Before: 3 8 15 7 10 3 6 4 9 After: 8 18 15 25 10 16 7 15 4
Assume another input given as the nodes of binary tree reading, [4 6 7 8 5 3 2 7 1], and the resultant binary tree is obtained as ?
Input: [4 6 7 8 5 3 2 7 1] Result? Before: 8 6 2 5 7 4 7 1 3 After: 6 10 11 9 9 14 5 10 1
Example
Following is the C++ implementation of the above method ?
<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 macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><vector></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>
<span class="token keyword">void</span> <span class="token function">solve</span><span class="token punctuation">(</span>Node<span class="token operator">*</span> root<span class="token punctuation">,</span> vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token operator">&</span> arr<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">&</span> index<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 punctuation">;</span>
<span class="token function">solve</span><span class="token punctuation">(</span>root<span class="token operator">-></span>left<span class="token punctuation">,</span> arr<span class="token punctuation">,</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span>
index<span class="token operator">++</span><span class="token punctuation">;</span>
root<span class="token operator">-></span>value <span class="token operator">=</span> arr<span class="token punctuation">[</span>index<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> arr<span class="token punctuation">[</span>index<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
<span class="token function">solve</span><span class="token punctuation">(</span>root<span class="token operator">-></span>right<span class="token punctuation">,</span> arr<span class="token punctuation">,</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">storeInOrder</span><span class="token punctuation">(</span>Node<span class="token operator">*</span> root<span class="token punctuation">,</span> vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token operator">&</span> arr<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 punctuation">;</span>
<span class="token function">storeInOrder</span><span class="token punctuation">(</span>root<span class="token operator">-></span>left<span class="token punctuation">,</span> arr<span class="token punctuation">)</span><span class="token punctuation">;</span>
arr<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>root<span class="token operator">-></span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">storeInOrder</span><span class="token punctuation">(</span>root<span class="token operator">-></span>right<span class="token punctuation">,</span> arr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">printInorder</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 operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token function">printInorder</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">printInorder</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 keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</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">2</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">7</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">5</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">2</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">6</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">9</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">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>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">11</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">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
cout <span class="token operator"><<</span> <span class="token string">"Before: "</span><span class="token punctuation">;</span>
<span class="token function">printInorder</span><span class="token punctuation">(</span>root<span class="token punctuation">)</span><span class="token punctuation">;</span>
cout <span class="token operator"><<</span> <span class="token string">"\n"</span><span class="token punctuation">;</span>
vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> arr<span class="token punctuation">;</span>
arr<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">storeInOrder</span><span class="token punctuation">(</span>root<span class="token punctuation">,</span> arr<span class="token punctuation">)</span><span class="token punctuation">;</span>
arr<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">solve</span><span class="token punctuation">(</span>root<span class="token punctuation">,</span> arr<span class="token punctuation">,</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span>
cout <span class="token operator"><<</span> <span class="token string">"After: "</span><span class="token punctuation">;</span>
<span class="token function">printInorder</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
Before: 2 7 5 6 11 2 5 4 9 After: 7 7 13 16 8 16 6 14 4
Explanation
| Node | Inorder Predecessor | Inorder Successor | New Value |
|---|---|---|---|
| 2(root) | 11 | 5 | 16 |
| 7(root->left) | 2 | 5 | 7 |
| 5(root->right) | 2 | 4 | 6 |
| 2(root->left->left) | 0(not available) | 7 | 7 |
| 6(root->left->right) | 5 | 11 | 16 |
| 9(root->right->right) | 4 | 0(not available) | 4 |
| 5(root->left->right->left) | 7 | 6 | 13 |
| 11(root->left->right->right) | 6 | 2 | 8 |
| 4(root->right->right->left) | 5 | 9 | 14 |
Conclusion
Storing the inorder and then finding the inorder of each element turn by turn is the key. We use the index as a backtrack to find out where the element was when inserted into the array, and then we compute the new in order of the tree. We traverse the tree and each node once, so the time complexity is O(n), and we store each element in the form of inorder, so the space complexity is O(n).
