Skip to main content

Iterative n-ary tree preorder traversal

In the realm of N-ary trees, the iterative preorder traversal technique stands as an essential tool for navigating through their diverse structures. This article unveils the magic behind this traversal method, diving into problem elucidation, algorithmic breakdown, code implementation, and output comprehension.

Preorder traversal in n-ary tree

Problem Statement

The task at hand involves executing a preorder traversal on an N-ary tree using an iterative approach. Preorder traversal visits the root node first, followed by traversing all the subtrees rooted at the children of the root.

Example

Consider the following N-ary tree:


       10
      /   \
     /     \
    /       \   
   8         5
  /|\      /|\ \ 
 / | \    / | \ \
-2 1  6  7 18 3  4
  / \           /| \
 9  11         2 1  3
   /  \
  17   12   

Upon executing iterative preorder traversal, the nodes are printed in the sequence: 10, 8, -2, 1, 9, 11, 17, 12, 6, 5, 7, 18, 3, 4, 2, 1, and 3.

Idea to Solve

Iterative preorder traversal employs a stack to manage nodes' processing order. The algorithm simulates the recursive behavior by pushing nodes onto the stack while visiting them in the expected preorder manner.

Pseudocode

function printPreorder():
    if tree root is null:
        return
    create an empty stack
    push the root node onto the stack
    while stack is not empty:
        pop a node from the top of the stack
        push all children of the node onto the stack (in reverse order)
        print the node's value

Algorithm Explanation

  1. If the root of the tree is null, return.
  2. Create an empty stack.
  3. Push the root node onto the stack.
  4. While the stack is not empty:
    • Pop a node from the top of the stack.
    • Push all children of the node onto the stack, ensuring the last child is pushed first.
    • Print the value of the node.

Code Solution

import java.util.Vector;
import java.util.ArrayList;
import java.util.Stack;
// Java program for
// Iterative Preorder Traversal of an N-ary Tree 
class TreeNode
{
    public int key;
    public Vector < TreeNode > child;
    public TreeNode(int key)
    {
        // Set node key
        this.key = key;
        // Create memory of TreeNode child
        this.child = new Vector < TreeNode > ();
    }
    public void addChild(int key)
    {
        // Create a new node
        TreeNode node = new TreeNode(key);
        // Add node into child
        this.child.add(node);
    }
}
public class NAryTree
{
    public TreeNode root;
    public NAryTree()
    {
        // Set initial tree root to null
        this.root = null;
    }
    public void printPreorder()
    {
        if (this.root == null)
        {
            return;
        }
        Stack < TreeNode > record = new Stack < TreeNode > ();
        // Add first node
        record.push(this.root);
        TreeNode node = null;
        while (record.isEmpty() == false)
        {
            // Get top element
            node = record.peek();
            // Remove top element
            record.pop();
            for (int i = node.child.size() - 1; i >= 0; --i)
            {
                record.push(node.child.get(i));
            }
            // Print node value
            System.out.print("  " + node.key);
        }
    }
    public static void main(String[] args)
    {
        NAryTree tree = new NAryTree();
        /*
                   10
                  /   \
                 /     \
                /       \   
               8         5
              /|\      /|\ \ 
             / | \    / | \ \
            -2 1  6  7 18 3  4
              / \           /| \
             9  11         2 1  3
               /  \
              17   12   
            -----------------------
            Constructing N-Arr tree
        */
        // First element of tree
        tree.root = new TreeNode(10);
        tree.root.addChild(8);
        tree.root.addChild(5);
        // Add child node [-2,1,6] in node (8)
        tree.root.child.get(0).addChild(-2);
        tree.root.child.get(0).addChild(1);
        tree.root.child.get(0).addChild(6);
        // Add child node [9,11] in node (1)
        tree.root.child.get(0).child.get(1).addChild(9);
        tree.root.child.get(0).child.get(1).addChild(11);
        // Add child node [17  12] in node (11)
        tree.root.child.get(0).child.get(1).child.get(1).addChild(17);
        tree.root.child.get(0).child.get(1).child.get(1).addChild(12);
        // Add child node [7 18 3  4] in node (5)
        tree.root.child.get(1).addChild(7);
        tree.root.child.get(1).addChild(18);
        tree.root.child.get(1).addChild(3);
        tree.root.child.get(1).addChild(4);
        // Add child node [2,1,3] in node (4)
        tree.root.child.get(1).child.get(3).addChild(2);
        tree.root.child.get(1).child.get(3).addChild(1);
        tree.root.child.get(1).child.get(3).addChild(3);
        tree.printPreorder();
    }
}

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
package main
import "fmt"
// Go program for
// Iterative Preorder Traversal of an N-ary Tree
type TreeNode struct {
    key int
    child [] *TreeNode
}
func getTreeNode(key int) * TreeNode {
    var me *TreeNode = &TreeNode {}
    // Set node key
    me.key = key
    // Create memory of TreeNode child
    me.child = make([] *TreeNode,0)
    return me
}
func(this *TreeNode) addChild(key int) {
    // Create a new node
    var node * TreeNode = getTreeNode(key)
    // Add node into child
    this.child = append(this.child, node)
}
type NAryTree struct {
    root * TreeNode
}
func getNAryTree() * NAryTree {
    var me *NAryTree = &NAryTree {}
    // Set initial tree root to null
    me.root = nil
    return me
}
func(this *NAryTree) printPreorder() {
    if this.root == nil {
        return
    }
    var record = make([] *TreeNode, 0)
    // Add first node
    record = append(record, this.root)
    var node * TreeNode = nil
    for (len(record) > 0 ) {
        // Get top element
        node = record[len(record) - 1]
        // Remove top element
        record = record[: len(record) - 1]
        for i := len(node.child) - 1 ; i >= 0 ; i-- {
            record = append(record, node.child[i])
        }
        // Print node value
        fmt.Print("  ", node.key)
    }
}
func main() {
    var tree * NAryTree = getNAryTree()
    /*
               10
              /   \
             /     \
            /       \   
           8         5
          /|\      /|\ \ 
         / | \    / | \ \
        -2 1  6  7 18 3  4
          / \           /| \
         9  11         2 1  3
           /  \
          17   12   
        -----------------------
        Constructing N-Arr tree
    */
    // First element of tree
    tree.root = getTreeNode(10)
    tree.root.addChild(8)
    tree.root.addChild(5)
    // Add child node [-2,1,6] in node (8)
    tree.root.child[0].addChild(-2)
    tree.root.child[0].addChild(1)
    tree.root.child[0].addChild(6)
    // Add child node [9,11] in node (1)
    tree.root.child[0].child[1].addChild(9)
    tree.root.child[0].child[1].addChild(11)
    // Add child node [17  12] in node (11)
    tree.root.child[0].child[1].child[1].addChild(17)
    tree.root.child[0].child[1].child[1].addChild(12)
    // Add child node [7 18 3  4] in node (5)
    tree.root.child[1].addChild(7)
    tree.root.child[1].addChild(18)
    tree.root.child[1].addChild(3)
    tree.root.child[1].addChild(4)
    // Add child node [2,1,3] in node (4)
    tree.root.child[1].child[3].addChild(2)
    tree.root.child[1].child[3].addChild(1)
    tree.root.child[1].child[3].addChild(3)
    tree.printPreorder()
}

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
// Include header file
#include <iostream>
#include <stack>
#include <vector>

using namespace std;
// C++ program for
// Iterative Preorder Traversal of an N-ary Tree
class TreeNode
{
    public: int key;
    vector < TreeNode *> child;
    TreeNode(int key)
    {
        // Set node key
        this->key = key;
    }
    void addChild(int key)
    {
        // Create a new node
        TreeNode *node = new TreeNode(key);
        // Add node into child
        this->child.push_back(node);
    }
};
class NAryTree
{
    public: TreeNode *root;
    NAryTree()
    {
        this->root = NULL;
    }
    void printPreorder()
    {
        if (this->root == NULL)
        {
            return;
        }
        stack < TreeNode *> record;
        // Add first node
        record.push(this->root);
        TreeNode *node = NULL;
        while (record.empty() == false)
        {
            // Get top element
            node = record.top();
            // Remove top element
            record.pop();
            for (int i = node->child.size() - 1; i >= 0; --i)
            {
                record.push(node->child.at(i));
            }
            // Print node value
            cout << "  " << node->key;
        }
    }
};
int main()
{
    NAryTree *tree = new NAryTree();
    /*
               10
              /   \
             /     \
            /       \   
           8         5
          /|\      /|\ \ 
         / | \    / | \ \
        -2 1  6  7 18 3  4
          / \           /| \
         9  11         2 1  3
           /  \
          17   12   
        -----------------------
        Constructing N-Arr tree
    */
    // First element of tree
    tree->root = new TreeNode(10);
    tree->root->addChild(8);
    tree->root->addChild(5);
    // Add child node [-2,1,6] in node (8)
    tree->root->child.at(0)->addChild(-2);
    tree->root->child.at(0)->addChild(1);
    tree->root->child.at(0)->addChild(6);
    // Add child node [9,11] in node (1)
    tree->root->child.at(0)->child.at(1)->addChild(9);
    tree->root->child.at(0)->child.at(1)->addChild(11);
    // Add child node [17  12] in node (11)
    tree->root->child.at(0)->child.at(1)->child.at(1)->addChild(17);
    tree->root->child.at(0)->child.at(1)->child.at(1)->addChild(12);
    // Add child node [7 18 3  4] in node (5)
    tree->root->child.at(1)->addChild(7);
    tree->root->child.at(1)->addChild(18);
    tree->root->child.at(1)->addChild(3);
    tree->root->child.at(1)->addChild(4);
    // Add child node [2,1,3] in node (4)
    tree->root->child.at(1)->child.at(3)->addChild(2);
    tree->root->child.at(1)->child.at(3)->addChild(1);
    tree->root->child.at(1)->child.at(3)->addChild(3);
    tree->printPreorder();
    return 0;
}

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
// Include namespace system
using System;
using System.Collections.Generic;
// Csharp program for
// Iterative Preorder Traversal of an N-ary Tree
public class TreeNode
{
    public int key;
    public List < TreeNode > child;
    public TreeNode(int key)
    {
        // Set node key
        this.key = key;
        // Create memory of TreeNode child
        this.child = new List < TreeNode > ();
    }
    public void addChild(int key)
    {
        // Create a new node
        TreeNode node = new TreeNode(key);
        // Add node into child
        this.child.Add(node);
    }
}
public class NAryTree
{
    public TreeNode root;
    public NAryTree()
    {
        // Set initial tree root to null
        this.root = null;
    }
    public void printPreorder()
    {
        if (this.root == null)
        {
            return;
        }
        Stack < TreeNode > record = new Stack < TreeNode > ();
        // Add first node
        record.Push(this.root);
        TreeNode node = null;
        while ((record.Count == 0) == false)
        {
            // Get top element
            node = record.Peek();
            // Remove top element
            record.Pop();
            for (int i = node.child.Count - 1; i >= 0; --i)
            {
                record.Push(node.child[i]);
            }
            // Print node value
            Console.Write("  " + node.key);
        }
    }
    public static void Main(String[] args)
    {
        NAryTree tree = new NAryTree();
        /*
                   10
                  /   \
                 /     \
                /       \   
               8         5
              /|\      /|\ \ 
             / | \    / | \ \
            -2 1  6  7 18 3  4
              / \           /| \
             9  11         2 1  3
               /  \
              17   12   
            -----------------------
            Constructing N-Arr tree
        */
        // First element of tree
        tree.root = new TreeNode(10);
        tree.root.addChild(8);
        tree.root.addChild(5);
        // Add child node [-2,1,6] in node (8)
        tree.root.child[0].addChild(-2);
        tree.root.child[0].addChild(1);
        tree.root.child[0].addChild(6);
        // Add child node [9,11] in node (1)
        tree.root.child[0].child[1].addChild(9);
        tree.root.child[0].child[1].addChild(11);
        // Add child node [17  12] in node (11)
        tree.root.child[0].child[1].child[1].addChild(17);
        tree.root.child[0].child[1].child[1].addChild(12);
        // Add child node [7 18 3  4] in node (5)
        tree.root.child[1].addChild(7);
        tree.root.child[1].addChild(18);
        tree.root.child[1].addChild(3);
        tree.root.child[1].addChild(4);
        // Add child node [2,1,3] in node (4)
        tree.root.child[1].child[3].addChild(2);
        tree.root.child[1].child[3].addChild(1);
        tree.root.child[1].child[3].addChild(3);
        tree.printPreorder();
    }
}

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
<?php
// Php program for
// Iterative Preorder Traversal of an N-ary Tree
class TreeNode
{
    public $key;
    public $child;
    public  function __construct($key)
    {
        // Set node key
        $this->key = $key;
        // Create memory of TreeNode child
        $this->child = array();
    }
    public  function addChild($key)
    {
        // Create a new node
        $node = new TreeNode($key);
        // Add node into child
        $this->child[] = $node;
    }
}
class NAryTree
{
    public $root;
    public  function __construct()
    {
        $this->root = NULL;
    }
    public  function printPreorder()
    {
        if ($this->root == NULL)
        {
            return;
        }
        $record = array();
        // Add first node
        array_push($record, $this->root);
        $node = NULL;
        while (empty($record) == false)
        {
            // Get top element
            $node = end($record);
            // Remove top element
            array_pop($record);
            for ($i = count($node->child) - 1; $i >= 0; --$i)
            {
                array_push($record, $node->child[$i]);
            }
            // Print node value
            echo("  ".$node->key);
        }
    }
}

function main()
{
    $tree = new NAryTree();
    /*
               10
              /   \
             /     \
            /       \   
           8         5
          /|\      /|\ \ 
         / | \    / | \ \
        -2 1  6  7 18 3  4
          / \           /| \
         9  11         2 1  3
           /  \
          17   12   
        -----------------------
        Constructing N-Arr tree
    */
    // First element of tree
    $tree->root = new TreeNode(10);
    $tree->root->addChild(8);
    $tree->root->addChild(5);
    // Add child node [-2,1,6] in node (8)
    $tree->root->child[0]->addChild(-2);
    $tree->root->child[0]->addChild(1);
    $tree->root->child[0]->addChild(6);
    // Add child node [9,11] in node (1)
    $tree->root->child[0]->child[1]->addChild(9);
    $tree->root->child[0]->child[1]->addChild(11);
    // Add child node [17  12] in node (11)
    $tree->root->child[0]->child[1]->child[1]->addChild(17);
    $tree->root->child[0]->child[1]->child[1]->addChild(12);
    // Add child node [7 18 3  4] in node (5)
    $tree->root->child[1]->addChild(7);
    $tree->root->child[1]->addChild(18);
    $tree->root->child[1]->addChild(3);
    $tree->root->child[1]->addChild(4);
    // Add child node [2,1,3] in node (4)
    $tree->root->child[1]->child[3]->addChild(2);
    $tree->root->child[1]->child[3]->addChild(1);
    $tree->root->child[1]->child[3]->addChild(3);
    $tree->printPreorder();
}
main();

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
// Node JS program for
// Iterative Preorder Traversal of an N-ary Tree
class TreeNode
{
    constructor(key)
    {
        // Set node key
        this.key = key;
        // Create memory of TreeNode child
        this.child = [];
    }
    addChild(key)
    {
        // Create a new node
        var node = new TreeNode(key);
        // Add node into child
        this.child.push(node);
    }
}
class NAryTree
{
    constructor()
    {
        this.root = null;
    }
    printPreorder()
    {
        if (this.root == null)
        {
            return;
        }
        var record = [];
        // Add first node
        record.push(this.root);
        var node = null;
        while ((record.length == 0) == false)
        {
            // Get top element
            node = record[record.length - 1];
            // Remove top element
            record.pop();
            for (var i = node.child.length - 1; i >= 0; --i)
            {
                record.push(node.child[i]);
            }
            // Print node value
            process.stdout.write("  " + node.key);
        }
    }
}

function main()
{
    var tree = new NAryTree();
    /*
               10
              /   \
             /     \
            /       \   
           8         5
          /|\      /|\ \ 
         / | \    / | \ \
        -2 1  6  7 18 3  4
          / \           /| \
         9  11         2 1  3
           /  \
          17   12   
        -----------------------
        Constructing N-Arr tree
    */
    // First element of tree
    tree.root = new TreeNode(10);
    tree.root.addChild(8);
    tree.root.addChild(5);
    // Add child node [-2,1,6] in node (8)
    tree.root.child[0].addChild(-2);
    tree.root.child[0].addChild(1);
    tree.root.child[0].addChild(6);
    // Add child node [9,11] in node (1)
    tree.root.child[0].child[1].addChild(9);
    tree.root.child[0].child[1].addChild(11);
    // Add child node [17  12] in node (11)
    tree.root.child[0].child[1].child[1].addChild(17);
    tree.root.child[0].child[1].child[1].addChild(12);
    // Add child node [7 18 3  4] in node (5)
    tree.root.child[1].addChild(7);
    tree.root.child[1].addChild(18);
    tree.root.child[1].addChild(3);
    tree.root.child[1].addChild(4);
    // Add child node [2,1,3] in node (4)
    tree.root.child[1].child[3].addChild(2);
    tree.root.child[1].child[3].addChild(1);
    tree.root.child[1].child[3].addChild(3);
    tree.printPreorder();
}
main();

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
#  Python 3 program for
#  Iterative Preorder Traversal of an N-ary Tree
class TreeNode :
    def __init__(self, key) :
        #  Set node key
        self.key = key
        #  Create memory of TreeNode child
        self.child = []
    
    def addChild(self, key) :
        #  Create a new node
        node = TreeNode(key)
        #  Add node into child
        self.child.append(node)
    

class NAryTree :
    def __init__(self) :
        self.root = None
    
    def printPreorder(self) :
        if (self.root == None) :
            return
        
        record = []
        #  Add first node
        record.append(self.root)
        node = None
        while ((len(record) == 0) == False) :
            #  Get top element
            node = record[-1]
            #  Remove top element
            record.pop()
            i = len(node.child) - 1
            while (i >= 0) :
                record.append(node.child[i])
                i -= 1
            
            #  Print node value
            print(" ", node.key, end = "")
        
    

def main() :
    tree = NAryTree()
    #           10
    #          /   \
    #         /     \
    #        /       \   
    #       8         5
    #      /|\      /|\ \ 
    #     / | \    / | \ \
    #    -2 1  6  7 18 3  4
    #      / \           /| \
    #     9  11         2 1  3
    #       /  \
    #      17   12   
    #    -----------------------
    #    Constructing N-Arr tree
    #  First element of tree
    tree.root = TreeNode(10)
    tree.root.addChild(8)
    tree.root.addChild(5)
    #  Add child node [-2,1,6] in node (8)
    tree.root.child[0].addChild(-2)
    tree.root.child[0].addChild(1)
    tree.root.child[0].addChild(6)
    #  Add child node [9,11] in node (1)
    tree.root.child[0].child[1].addChild(9)
    tree.root.child[0].child[1].addChild(11)
    #  Add child node [17  12] in node (11)
    tree.root.child[0].child[1].child[1].addChild(17)
    tree.root.child[0].child[1].child[1].addChild(12)
    #  Add child node [7 18 3  4] in node (5)
    tree.root.child[1].addChild(7)
    tree.root.child[1].addChild(18)
    tree.root.child[1].addChild(3)
    tree.root.child[1].addChild(4)
    #  Add child node [2,1,3] in node (4)
    tree.root.child[1].child[3].addChild(2)
    tree.root.child[1].child[3].addChild(1)
    tree.root.child[1].child[3].addChild(3)
    tree.printPreorder()

if __name__ == "__main__": main()

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
#  Ruby program for
#  Iterative Preorder Traversal of an N-ary Tree
class TreeNode 
    # Define the accessor and reader of class TreeNode
    attr_reader :key, :child
    attr_accessor :key, :child
    def initialize(key) 
        #  Set node key
        self.key = key
        #  Create memory of TreeNode child
        self.child = []
    end

    def addChild(key) 
        #  Create a new node
        node = TreeNode.new(key)
        #  Add node into child
        self.child.push(node)
    end

end

class NAryTree 
    # Define the accessor and reader of class NAryTree
    attr_reader :root
    attr_accessor :root
    def initialize() 
        self.root = nil
    end

    def printPreorder() 
        if (self.root == nil) 
            return
        end

        record = []
        #  Add first node
        record.push(self.root)
        node = nil
        while (record.length != 0) 
            #  Get top element
            node = record.last
            #  Remove top element
            record.pop()
            i = node.child.length - 1
            while (i >= 0) 
                record.push(node.child[i])
                i -= 1
            end

            #  Print node value
            print("  ", node.key)
        end

    end

end

def main() 
    tree = NAryTree.new()
    #           10
    #          /   \
    #         /     \
    #        /       \   
    #       8         5
    #      /|\      /|\ \ 
    #     / | \    / | \ \
    #    -2 1  6  7 18 3  4
    #      / \           /| \
    #     9  11         2 1  3
    #       /  \
    #      17   12   
    #    -----------------------
    #    Constructing N-Arr tree
    #  First element of tree
    tree.root = TreeNode.new(10)
    tree.root.addChild(8)
    tree.root.addChild(5)
    #  Add child node [-2,1,6] in node (8)
    tree.root.child[0].addChild(-2)
    tree.root.child[0].addChild(1)
    tree.root.child[0].addChild(6)
    #  Add child node [9,11] in node (1)
    tree.root.child[0].child[1].addChild(9)
    tree.root.child[0].child[1].addChild(11)
    #  Add child node [17  12] in node (11)
    tree.root.child[0].child[1].child[1].addChild(17)
    tree.root.child[0].child[1].child[1].addChild(12)
    #  Add child node [7 18 3  4] in node (5)
    tree.root.child[1].addChild(7)
    tree.root.child[1].addChild(18)
    tree.root.child[1].addChild(3)
    tree.root.child[1].addChild(4)
    #  Add child node [2,1,3] in node (4)
    tree.root.child[1].child[3].addChild(2)
    tree.root.child[1].child[3].addChild(1)
    tree.root.child[1].child[3].addChild(3)
    tree.printPreorder()
end

main()

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
import scala.collection.mutable._;
// Scala program for
// Iterative Preorder Traversal of an N-ary Tree
class TreeNode(var key: Int,
    var child: ArrayBuffer[TreeNode])
{
    def this(key: Int)
    {
        // Set node key
        // Create memory of TreeNode child
        this(key, new ArrayBuffer[TreeNode]());
    }
    def addChild(key: Int): Unit = {
        // Create a new node
        var node: TreeNode = new TreeNode(key);
        // Add node into child
        this.child += node;
    }
}
class NAryTree(var root: TreeNode)
{
    def this()
    {
        this(null);
    }
    def printPreorder(): Unit = {
        if (this.root == null)
        {
            return;
        }
        var record: Stack[TreeNode] = new Stack[TreeNode]();
        // Add first node
        record.push(this.root);
        var node: TreeNode = null;
        while (record.isEmpty == false)
        {
            // Get top element
            node = record.top;
            // Remove top element
            record.pop;
            var i: Int = node.child.size - 1;
            while (i >= 0)
            {
                record.push(node.child(i));
                i -= 1;
            }
            // Print node value
            print("  " + node.key);
        }
    }
}
object Main
{
    def main(args: Array[String]): Unit = {
        var tree: NAryTree = new NAryTree();
        /*
                   10
                  /   \
                 /     \
                /       \   
               8         5
              /|\      /|\ \ 
             / | \    / | \ \
            -2 1  6  7 18 3  4
              / \           /| \
             9  11         2 1  3
               /  \
              17   12   
            -----------------------
            Constructing N-Arr tree
        */
        // First element of tree
        tree.root = new TreeNode(10);
        tree.root.addChild(8);
        tree.root.addChild(5);
        // Add child node [-2,1,6] in node (8)
        tree.root.child(0).addChild(-2);
        tree.root.child(0).addChild(1);
        tree.root.child(0).addChild(6);
        // Add child node [9,11] in node (1)
        tree.root.child(0).child(1).addChild(9);
        tree.root.child(0).child(1).addChild(11);
        // Add child node [17  12] in node (11)
        tree.root.child(0).child(1).child(1).addChild(17);
        tree.root.child(0).child(1).child(1).addChild(12);
        // Add child node [7 18 3  4] in node (5)
        tree.root.child(1).addChild(7);
        tree.root.child(1).addChild(18);
        tree.root.child(1).addChild(3);
        tree.root.child(1).addChild(4);
        // Add child node [2,1,3] in node (4)
        tree.root.child(1).child(3).addChild(2);
        tree.root.child(1).child(3).addChild(1);
        tree.root.child(1).child(3).addChild(3);
        tree.printPreorder();
    }
}

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
import Foundation;
// Swift 4 program for
// Iterative Preorder Traversal of an N-ary Tree
class TreeNode
{
    var key: Int;
    var child: [TreeNode? ];
    init(_ key: Int)
    {
        // Set node key
        self.key = key;
        // Create memory of TreeNode child
        self.child = [TreeNode?]();
    }
    func addChild(_ key: Int)
    {
        // Create a new node
        let node: TreeNode = TreeNode(key);
        // Add node into child
        self.child.append(node);
    }
}
// Stack Node
class SNode
{
    var data : TreeNode?;
    var next : SNode?;
    init(_ data : TreeNode?)
    {
        self.data = data;
        self.next = nil;
    }
}
// Define custom stack and its operation
class MyStack
{
    var top: SNode? ;
    init()
    {
        self.top = nil;
    }
    //Add a new element in stack
    func push(_ data: TreeNode?)
    {
        //Make a new stack node
        let node: SNode? = SNode(data);
        if (node != nil)
        {
            node!.next = self.top;
            self.top = node;
        }
        else
        {
            print("Memory overflow\n", terminator: "");
        }
    }
    // Remove a top element in stack
    func pop()
    {
        if (self.top != nil)
        {
            self.top = self.top!.next;
        }
    }
    // Check that whether stack is empty or not
    func isEmpty() -> Bool
    {
        if (self.top != nil)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    // Used to get top element of stack
    func peek() -> TreeNode?
    {
        if (self.top != nil)
        {
            return self.top!.data;
        }
        else
        {
            return nil;
        }
    }
}

class NAryTree
{
    var root: TreeNode? ;
    init()
    {
        self.root = nil;
    }
    func printPreorder()
    {
        if (self.root == nil)
        {
            return;
        }
        let record = MyStack();
        // Add first node
        record.push(self.root);
        var node: TreeNode? = nil;
        while (record.isEmpty() == false)
        {
            // Get top element
            node = record.peek();
            // Remove top element
            record.pop();
            var i: Int = node!.child.count - 1;
            while (i >= 0)
            {
                record.push(node!.child[i]);
                i -= 1;
            }
            // Print node value
            print(" ", node!.key, terminator: "");
        }
    }
}
func main()
{
    let tree: NAryTree = NAryTree();
    /*
               10
              /   \
             /     \
            /       \   
           8         5
          /|\      /|\ \ 
         / | \    / | \ \
        -2 1  6  7 18 3  4
          / \           /| \
         9  11         2 1  3
           /  \
          17   12   
        -----------------------
        Constructing N-Arr tree
    */
    // First element of tree
    tree.root = TreeNode(10);
    tree.root!.addChild(8);
    tree.root!.addChild(5);
    // Add child node [-2,1,6] in node (8)
    tree.root!.child[0]!.addChild(-2);
    tree.root!.child[0]!.addChild(1);
    tree.root!.child[0]!.addChild(6);
    // Add child node [9,11] in node (1)
    tree.root!.child[0]!.child[1]!.addChild(9);
    tree.root!.child[0]!.child[1]!.addChild(11);
    // Add child node [17  12] in node (11)
    tree.root!.child[0]!.child[1]!.child[1]!.addChild(17);
    tree.root!.child[0]!.child[1]!.child[1]!.addChild(12);
    // Add child node [7 18 3  4] in node (5)
    tree.root!.child[1]!.addChild(7);
    tree.root!.child[1]!.addChild(18);
    tree.root!.child[1]!.addChild(3);
    tree.root!.child[1]!.addChild(4);
    // Add child node [2,1,3] in node (4)
    tree.root!.child[1]!.child[3]!.addChild(2);
    tree.root!.child[1]!.child[3]!.addChild(1);
    tree.root!.child[1]!.child[3]!.addChild(3);
    tree.printPreorder();
}
main();

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3
import java.util.Stack;
// Kotlin program for
// Iterative Preorder Traversal of an N-ary Tree
class TreeNode
{
    var key: Int;
    var child: MutableList < TreeNode>  ;
    constructor(key: Int)
    {
        // Set node key
        this.key = key;
        // Create memory of TreeNode child
        this.child = mutableListOf < TreeNode > ();
    }
    fun addChild(key: Int): Unit
    {
        // Create a new node
        val node: TreeNode = TreeNode(key);
        // Add node into child
        this.child.add(node);
    }
}
class NAryTree
{
    var root: TreeNode ? ;
    constructor()
    {
        this.root = null;
    }
    fun printPreorder(): Unit
    {
        if (this.root == null)
        {
            return;
        }
        val record: Stack < TreeNode > = Stack < TreeNode > ();
        // Add first node
        record.push(this.root);
        var node: TreeNode ? ;
        while (record.empty() == false)
        {
            // Get top element
            node = record.peek();
            // Remove top element
            record.pop();
            var i: Int = node!!.child.size - 1;
            while (i >= 0)
            {
                record.push(node.child[i]);
                i -= 1;
            }
            // Print node value
            print("  " + node.key);
        }
    }
}
fun main(args: Array < String > ): Unit
{
    val tree: NAryTree = NAryTree();
    /*
               10
              /   \
             /     \
            /       \   
           8         5
          /|\      /|\ \ 
         / | \    / | \ \
        -2 1  6  7 18 3  4
          / \           /| \
         9  11         2 1  3
           /  \
          17   12   
        -----------------------
        Constructing N-Arr tree
    */
    // First element of tree
    tree.root = TreeNode(10);
    tree.root?.addChild(8);
    tree.root?.addChild(5);
    // Add child node [-2,1,6] in node (8)
    tree.root!!.child[0].addChild(-2);
    tree.root!!.child[0].addChild(1);
    tree.root!!.child[0].addChild(6);
    // Add child node [9,11] in node (1)
    tree.root!!.child[0].child[1].addChild(9);
    tree.root!!.child[0].child[1].addChild(11);
    // Add child node [17  12] in node (11)
    tree.root!!.child[0].child[1].child[1].addChild(17);
    tree.root!!.child[0].child[1].child[1].addChild(12);
    // Add child node [7 18 3  4] in node (5)
    tree.root!!.child[1].addChild(7);
    tree.root!!.child[1].addChild(18);
    tree.root!!.child[1].addChild(3);
    tree.root!!.child[1].addChild(4);
    // Add child node [2,1,3] in node (4)
    tree.root!!.child[1].child[3].addChild(2);
    tree.root!!.child[1].child[3].addChild(1);
    tree.root!!.child[1].child[3].addChild(3);
    tree.printPreorder();
}

Output

  10  8  -2  1  9  11  17  12  6  5  7  18  3  4  2  1  3

Time Complexity Analysis

The time complexity of this algorithm depends on the number of nodes in the tree. In the worst case scenario, where each node is visited once, the time complexity is O(n), where n is the number of nodes in the tree.





Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment