Sink Odd nodes in Binary Tree

Given a Binary Tree having odd and even elements, sink all its odd valued nodes such that no node with odd value could be parent of node with even value. There can be multiple outputs for a given tree, we need to print one of them. It is always possible to convert a tree (Note that a node with even nodes and all odd nodes follows the rule)
Input :
1
/ \
2 3
Output
2 2
/ \ OR / \
1 3 3 1
Input :
1
/ \
5 8
/ \ / \
2 4 9 10
Output :
2 4
/ \ / \
4 8 OR 2 8 OR .. (any tree with
/ \ / \ / \ / \ same keys and
5 1 9 10 5 1 9 10 no odd is parent
of even)
We strongly recommend you to minimize your browser and try this yourself first.
Basically, we need to swap odd value of a node with even value of one of its descendants. The idea is to traverse the tree in a postorder fashion. Since we process in postorder, for each odd node encountered, its left and right subtrees are already balanced (sinked), we check if it’s an odd node and its left or right child has an even value. If even value is found, we swap the node’s data with that of even child node and call the procedure on the even child to balance the subtree. If both children have odd values, that means that all its descendants are odd.
Below is the implementation of the idea.Â
Implementation:
C++
// Program to sink odd nodes to the bottom of// binary tree#include<bits/stdc++.h>using namespace std;Â
// A binary tree nodestruct Node{Â Â Â Â int data;Â Â Â Â Node* left, *right;};Â
// Helper function to allocates a new nodeNode* newnode(int data){Â Â Â Â Node* node = new Node;Â Â Â Â node->data = data;Â Â Â Â node->left = node->right = NULL;Â Â Â Â return node;}Â
// Helper function to check if node is leaf nodebool isLeaf(Node *root){Â Â Â Â return (root->left == NULL && root->right == NULL);}Â
// A recursive method to sink a tree with odd root// This method assumes that the subtrees are already// sinked. This method is similar to Heapify of// Heap-Sortvoid sink(Node *&root){    // If NULL or is a leaf, do nothing    if (root == NULL || isLeaf(root))        return;Â
    // if left subtree exists and left child is even    if (root->left && !(root->left->data & 1))    {        // swap root's data with left child and        // fix left subtree        swap(root->data, root->left->data);        sink(root->left);    }Â
    // if right subtree exists and right child is even    else if(root->right && !(root->right->data & 1))    {        // swap root's data with right child and        // fix right subtree        swap(root->data, root->right->data);        sink(root->right);    }}Â
// Function to sink all odd nodes to the bottom of binary// tree. It does a postorder traversal and calls sink()// if any odd node is foundvoid sinkOddNodes(Node* &root){    // If NULL or is a leaf, do nothing    if (root == NULL || isLeaf(root))        return;Â
    // Process left and right subtrees before this node    sinkOddNodes(root->left);    sinkOddNodes(root->right);Â
    // If root is odd, sink it    if (root->data & 1)        sink(root);}Â
// Helper function to do Level Order Traversal of// Binary Tree level by level. This function is used// here only for showing modified tree.void printLevelOrder(Node* root){Â Â Â Â queue<Node*> q;Â Â Â Â q.push(root);Â
    // Do Level order traversal    while (!q.empty())    {        int nodeCount = q.size();Â
        // Print one level at a time        while (nodeCount)        {            Node *node = q.front();            printf("%d ", node->data);            q.pop();            if (node->left != NULL)                q.push(node->left);            if (node->right != NULL)                q.push(node->right);            nodeCount--;        }Â
        // Line separator for levels        printf("\n");    }}Â
// Driver program to test above functionsint main(){    /* Constructed binary tree is            1          /  \         5     8        / \  / \       2  4 9  10    */Â
    Node *root = newnode(1);    root->left = newnode(5);    root->right   = newnode(8);    root->left->left = newnode(2);    root->left->right = newnode(4);    root->right->left = newnode(9);    root->right->right = newnode(10);Â
    sinkOddNodes(root);Â
    printf("Level order traversal of modified tree\n");    printLevelOrder(root);Â
    return 0;} |
Java
// Java program to sink odd nodes to the bottom of// binary treeimport java.util.*;Â
class GFG{    // A binary tree node    static class Node    {        int data;        Node left, right;    };         // returns a new tree Node    static Node newnode(int data)    {        Node temp = new Node();        temp.data = data;        temp.left = temp.right = null;        return temp;    }         // Helper function to check if node is leaf node    static boolean isLeaf(Node root)    {        if(root==null){            return false;        }        return (root.left == null && root.right == null)?true:false;    }          // A recursive method to sink a tree with odd root    // This method assumes that the subtrees are already    // sinked. This method is similar to Heapify of    // Heap-Sort    static void sink(Node root)    {        // If NULL or is a leaf, do nothing        if (root == null || isLeaf(null))            return;              // if left subtree exists and left child is even        if (root.left!=null && (root.left.data & 1)==0)        {            // swap root's data with left child and            // fix left subtree            int temp = root.data;            root.data=root.left.data;            root.left.data=temp;            sink(root.left);        }              // if right subtree exists and right child is even        else if(root.right!=null && (root.right.data & 1)==0)        {            // swap root's data with right child and            // fix right subtree            int temp = root.data;            root.data=root.right.data;            root.right.data=temp;            sink(root.right);        }    }          // Function to sink all odd nodes to the bottom of binary    // tree. It does a postorder traversal and calls sink()    // if any odd node is found    static void sinkOddNodes(Node root)    {        // If NULL or is a leaf, do nothing        if (root == null || isLeaf(root))            return;              // Process left and right subtrees before this node        sinkOddNodes(root.left);        sinkOddNodes(root.right);              // If root is odd, sink it        if ((root.data & 1)!=0)             sink(root);    }          // Helper function to do Level Order Traversal of    // Binary Tree level by level. This function is used    // here only for showing modified tree.    static void printLevelOrder(Node root)    {        Queue<Node> q = new LinkedList<>();        q.add(root);              // Do Level order traversal        while (!q.isEmpty())        {            int nodeCount = q.size();                  // Print one level at a time            while (nodeCount>0)            {                Node node = q.poll();                System.out.print(node.data+" ");                if (node.left != null)                    q.add(node.left);                if (node.right != null)                    q.add(node.right);                nodeCount--;            }                  // Line separator for levels            System.out.println("");        }    }         // Driver code    public static void main(String[] args)    {                 /* Constructed binary tree is                1              /  \             5     8            / \  / \           2  4 9  10    */              Node root = newnode(1);        root.left = newnode(5);        root.right   = newnode(8);        root.left.left = newnode(2);        root.left.right = newnode(4);        root.right.left = newnode(9);        root.right.right = newnode(10);                 sinkOddNodes(root);          System.out.print("Level order traversal of modified tree\n");        printLevelOrder(root);    }}Â
/* This code is contributed by shruti456rawal */ |
Python3
# Python3 program to sink odd nodes # to the bottom of binary tree Â
# A binary tree node # Helper function to allocates a new node class newnode: Â
    # Constructor to create a new node     def __init__(self, key):         self.data = key         self.left = None        self.right = NoneÂ
# Helper function to check # if node is leaf node def isLeaf(root):    return (root.left == None and            root.right == None) Â
# A recursive method to sink a tree with odd root # This method assumes that the subtrees are # already sinked. This method is similar to # Heapify of Heap-Sort def sink(root):         # If None or is a leaf, do nothing     if (root == None or isLeaf(root)):        return         # if left subtree exists and     # left child is even     if (root.left and not(root.left.data & 1)):                 # swap root's data with left child         # and fix left subtree         root.data, \        root.left.data = root.left.data, \                         root.data        sink(root.left)              # if right subtree exists and     # right child is even     else if(root.right and not(root.right.data & 1)):                 # swap root's data with right child         # and fix right subtree         root.data, \        root.right.data = root.right.data, \                          root.data        sink(root.right) Â
# Function to sink all odd nodes to # the bottom of binary tree. It does # a postorder traversal and calls sink() # if any odd node is found def sinkOddNodes(root):         # If None or is a leaf, do nothing     if (root == None or isLeaf(root)):        return             # Process left and right subtrees     # before this node     sinkOddNodes(root.left)     sinkOddNodes(root.right)          # If root is odd, sink it     if (root.data & 1):        sink(root) Â
# Helper function to do Level Order Traversal # of Binary Tree level by level. This function # is used here only for showing modified tree. def printLevelOrder(root):    q = []    q.append(root)          # Do Level order traversal     while (len(q)):                 nodeCount = len(q)                 # Print one level at a time         while (nodeCount):            node = q[0]             print(node.data, end = " ")            q.pop(0)            if (node.left != None):                q.append(node.left)             if (node.right != None):                q.append(node.right)             nodeCount -= 1                 # Line separator for levels         print()Â
# Driver Code """ Constructed binary tree is             1         / \         5 8         / \ / \     2 4 9 10    """root = newnode(1) root.left = newnode(5) root.right = newnode(8) root.left.left = newnode(2) root.left.right = newnode(4) root.right.left = newnode(9) root.right.right = newnode(10) Â
sinkOddNodes(root) Â
print("Level order traversal of modified tree") printLevelOrder(root)Â
# This code is contributed by SHUBHAMSINGH10 |
C#
using System;using System.Collections.Generic;Â
class GFG {    // A binary tree node    class Node {        public int data;        public Node left, right;    };Â
    // returns a new tree Node    static Node newNode(int data)    {        Node temp = new Node();        temp.data = data;        temp.left = temp.right = null;        return temp;    }Â
    // Helper function to check if node is leaf node    static bool isLeaf(Node root)    {        if (root == null) {            return false;        }        return (root.left == null && root.right == null)            ? true            : false;    }Â
    // A recursive method to sink a tree with odd root    // This method assumes that the subtrees are already    // sinked. This method is similar to Heapify of    // Heap-Sort    static void sink(Node root)    {        // If NULL or is a leaf, do nothing        if (root == null || isLeaf(null))            return;Â
        // if left subtree exists and left child is even        if (root.left != null            && (root.left.data & 1) == 0) {            // swap root's data with left child and            // fix left subtree            int temp = root.data;            root.data = root.left.data;            root.left.data = temp;            sink(root.left);        }Â
        // if right subtree exists and right child is even        else if (root.right != null                 && (root.right.data & 1) == 0) {            // swap root's data with right child and            // fix right subtree            int temp = root.data;            root.data = root.right.data;            root.right.data = temp;            sink(root.right);        }    }Â
    // Function to sink all odd nodes to the bottom of    // binary tree. It does a postorder traversal and calls    // sink() if any odd node is found    static void sinkOddNodes(Node root)    {        // If NULL or is a leaf, do nothing        if (root == null || isLeaf(root))            return;Â
        // Process left and right subtrees before this node        sinkOddNodes(root.left);        sinkOddNodes(root.right);Â
        // If root is odd, sink it        if ((root.data & 1) != 0)            sink(root);    }Â
    // Helper function to do Level Order Traversal of    // Binary Tree level by level. This function is used    // here only for showing modified tree.    static void printLevelOrder(Node root)    {        Queue<Node> q = new Queue<Node>();        q.Enqueue(root);Â
        // Do Level order traversal        while (q.Count != 0) {            int nodeCount = q.Count;Â
            while (nodeCount > 0) {                Node node = q.Dequeue();                Console.Write(node.data + " ");                if (node.left != null)                    q.Enqueue(node.left);                if (node.right != null)                    q.Enqueue(node.right);                nodeCount--;            }Â
            Console.WriteLine("");        }    }    static void Main(string[] args)    {        /* Constructed binary tree is                1              /  \             5     8            / \  / \           2  4 9  10    */Â
        Node root = newNode(1);        root.left = newNode(5);        root.right = newNode(8);        root.left.left = newNode(2);        root.left.right = newNode(4);        root.right.left = newNode(9);        root.right.right = newNode(10);Â
        sinkOddNodes(root);Â
        Console.WriteLine(            "Level order traversal of modified tree");        printLevelOrder(root);    }} |
Javascript
<script>class Node {Â Â Â Â constructor(data) {Â Â Â Â Â Â Â Â this.data = data;Â Â Â Â Â Â Â Â this.left = null;Â Â Â Â Â Â Â Â this.right = null;Â Â Â Â }}Â
// Helper function to check // if node is leaf node function isLeaf(root) {Â Â Â Â return (root.left === null && root.right === null);}Â
// A recursive method to sink a tree with odd root // This method assumes that the subtrees are // already sinked. This method is similar to // Heapify of Heap-Sort function sink(root) {    // If None or is a leaf, do nothing     if (root === null || isLeaf(root)) {        return;    }Â
    // if left subtree exists and     // left child is even     if (root.left && !(root.left.data & 1)) {        // swap root's data with left child         // and fix left subtree         [root.data, root.left.data] = [root.left.data, root.data];        sink(root.left);    }    // if right subtree exists and     // right child is even     else if (root.right && !(root.right.data & 1)) {        // swap root's data with right child         // and fix right subtree         [root.data, root.right.data] = [root.right.data, root.data];        sink(root.right);    }}Â
// Function to sink all odd nodes to // the bottom of binary tree. It does // a postorder traversal and calls sink() // if any odd node is found function sinkOddNodes(root) {    // If None or is a leaf, do nothing     if (root === null || isLeaf(root)) {        return;    }Â
    // Process left and right subtrees     // before this node     sinkOddNodes(root.left);    sinkOddNodes(root.right);Â
    // If root is odd, sink it     if (root.data & 1) {        sink(root);    }}Â
// Helper function to do Level Order Traversal // of Binary Tree level by level. This function // is used here only for showing modified tree. function printLevelOrder(root) {Â Â Â Â let q = [];Â Â Â Â q.push(root);// Do Level order traversal while (q.length) {Â Â Â Â let nodeCount = q.length;Â
    // Print one level at a time     while (nodeCount) {        let node = q[0];        document.write(node.data+ " ");        q.shift();        if (node.left !== null) {            q.push(node.left);        }        if (node.right !== null) {            q.push(node.right);        }        nodeCount -= 1;    }Â
    // Line separator for levels     document.write("<br>")}}Â
// Driver Code/* Constructed binary tree is1/ \5 8/ \ / \2 4 9 10 */let root = new Node(1);root.left = new Node(5);root.right = new Node(8);root.left.left = new Node(2);root.left.right = new Node(4);root.right.left = new Node(9);root.right.right = new Node(10);Â
sinkOddNodes(root);Â
document.write("Level order traversal of modified tree");document.write("<br>")printLevelOrder(root);</script> |
Level order traversal of modified tree 2 4 8 5 1 9 10
Time Complexity:O(N), where N is total number of nodes in binary tree.
Space Complexity: O(N), where N is total number of nodes in binary tree
This article is contributed by Aditya Goel. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!


