Find parent of given node in a Binary Tree with given postorder traversal

Given two integers N and K where N denotes the height of a binary tree, the task is to find the parent of the node with value K in a binary tree whose postorder traversal is first 2^{N}-1 natural numbers (1, 2, ... 2^{N}-1).

For N = 3, the Tree will be -

      7
    /   \
   3     6
 /   \  /  \
1     2 4   5

Examples:

Input: N = 4, K = 5
Output: 6
Explanation:
Parent of the node 5 is 6. As shown in the tree above.

Input: N = 5, K = 3
Output: 7
Explanation:
Parent of the node 3 is 7. As shown in the tree above.

Naive Approach: A simple approach is to build the tree according to the following pattern and then traverse the whole tree to find the parent of a given node.



Efficient Approach: The idea is to use binary search to find the parent of the node. As we know the binary Tree of Height N has 2^{N}-1 nodes. Therefore, the search space for the binary search will be 1 to 2^{N}-1. Now each node has children value either \frac{X}{2} or X-1. Therefore, parent of such node can be found easily.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation to find the
// parent of the given node K in
// a binary tree whose post-order
// traversal is N natural numbers
  
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the parent
// of the given node
int findParent(int height, int node)
{
    int start = 1;
    int end = pow(2, height) - 1;
  
    // Condition to check whether
    // the given node is a root node.
    // if it is then return -1 because
    // root node has no parent
    if (end == node)
        return -1;
  
    // Loop till we found
    // the given node
    while (node >= 1) {
        end = end - 1;
  
        // Finding the middle node of the
        // tree because at every level
        // tree parent is
        // divided into two halves
        int mid = start
                  + (end - start)
                        / 2;
  
        // if the node is found return
        // the parent always the child
        // nodes of every node
        // is node/2 or (node-1)
        if (mid == node || end == node) {
            return (end + 1);
        }
  
        // if the node to be found
        // is greater than the mid
        // search for left subtree else
        // search in right subtree
        else if (node < mid) {
            end = mid;
        }
        else {
            start = mid;
        }
    }
}
  
// Driver Code
int main()
{
    int height = 4;
    int node = 6;
  
    int k = findParent(height, node);
    cout << k;
  
    return 0;
}

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation to find the
# parent of the given node
  
import math 
  
# Function to find the parent 
# of the given node
def findParent(height, node):
  
    start = 1
    end = pow(2, height) - 1
  
    # Check whether the given node 
    # is a root node.if it is then 
    # return -1 because root 
    # node has no parent
    if (end == node):
        return -1
  
    # Loop till we found 
    # the given node
    while(node >= 1):
  
        end = end - 1
  
        # Find the middle node of the 
        # tree because at every level 
        # tree parent is divided 
        # into two halves
        mid = start + (end - start)//2
  
        # if the node is found 
        # return the parent
        # always the child nodes of every
        # node is node / 2 or (node-1) 
        if(mid == node or end == node):
            return (end + 1)
          
        # if the node to be found is greater
        # than the mid search for left
        # subtree else search in right subtree
        elif (node < mid):
            end = mid
  
        else:
            start = mid
  
# Driver code
if __name__ == "__main__":
    height = 4
    node = 6
      
    # Function Call
    k = findParent(height, node)
    print(k)

chevron_right


Output:

7

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.