📌  相关文章
📜  无递归的 N 叉树的前序遍历

📅  最后修改于: 2022-05-13 01:57:20.351000             🧑  作者: Mango

无递归的 N 叉树的前序遍历

给定一个 n 叉树,打印它的前序遍历。

例子 :

这个想法是使用堆栈,如二叉树的迭代前序遍历。
1)创建一个空栈来存储节点。
2) 将根节点压入堆栈。
3) 在堆栈不为空时运行一个循环
....a) 从堆栈中弹出顶部节点。
....b) 打印弹出的节点。
....c) 将弹出节点的所有子节点存储到堆栈中。我们必须从右到左存储子节点,以便首先弹出最左边的节点。
4)如果堆栈是空的,那么我们就完成了。

C++
// C++ program to traverse an N-ary tree
// without recursion
#include 
using namespace std;
 
// Structure of a node of an n-ary tree
struct Node {
    char key;
    vector child;
};
 
// Utility function to create a new tree node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    return temp;
}
 
// Function to traverse tree without recursion
void traverse_tree(struct Node* root)
{
    // Stack to store the nodes
    stack nodes;
 
    // push the current node onto the stack
    nodes.push(root);
 
    // loop while the stack is not empty
    while (!nodes.empty()) {
 
        // store the current node and pop it from the stack
        Node* curr = nodes.top();
        nodes.pop();
 
        // current node has been travarsed
     if(curr != NULL)
      {
         cout << curr->key << " ";
 
        // store all the childrent of current node from
        // right to left.
        vector::iterator it = curr->child.end();
 
        while (it != curr->child.begin()) {
            it--;
            nodes.push(*it);
        }
      }
    }
}
// Driver program
int main()
{
    /*   Let us create below tree
   *            A
   *        /  / \  \
   *       B  F   D  E
   *      / \     |  /|\
   *     K  J     G C H I
   *    / \         |   |
   *   N   M        O   L
   */
 
    Node* root = newNode('A');
    (root->child).push_back(newNode('B'));
    (root->child).push_back(newNode('F'));
    (root->child).push_back(newNode('D'));
    (root->child).push_back(newNode('E'));
    (root->child[0]->child).push_back(newNode('K'));
    (root->child[0]->child).push_back(newNode('J'));
    (root->child[2]->child).push_back(newNode('G'));
    (root->child[3]->child).push_back(newNode('C'));
    (root->child[3]->child).push_back(newNode('H'));
    (root->child[3]->child).push_back(newNode('I'));
    (root->child[0]->child[0]->child).push_back(newNode('N'));
    (root->child[0]->child[0]->child).push_back(newNode('M'));
    (root->child[3]->child[0]->child).push_back(newNode('O'));
    (root->child[3]->child[2]->child).push_back(newNode('L'));
 
    traverse_tree(root);
 
    return 0;
}


Java
// Java program to traverse an N-ary tree
// without recursion
import java.util.ArrayList;
import java.util.Stack;
 
class GFG{
 
// Structure of a node of
// an n-ary tree
static class Node
{
    char key;
    ArrayList child;
 
    public Node(char key)
    {
        this.key = key;
        child = new ArrayList<>();
    }
};
 
// Function to traverse tree without recursion
static void traverse_tree(Node root)
{
     
    // Stack to store the nodes
    Stack nodes = new Stack<>();
 
    // push the current node onto the stack
    nodes.push(root);
 
    // Loop while the stack is not empty
    while (!nodes.isEmpty())
    {
         
        // Store the current node and pop
        // it from the stack
        Node curr = nodes.pop();
 
        // Current node has been travarsed
        if (curr != null)
        {
            System.out.print(curr.key + " ");
 
            // Store all the childrent of
            // current node from right to left.
            for(int i = curr.child.size() - 1; i >= 0; i--)
            {
                nodes.add(curr.child.get(i));
            }
        }
    }
}
 
// Driver code
public static void main(String[] args)
{
     
    /*   Let us create below tree
    *            A
    *        /  / \  \
    *       B  F   D  E
    *      / \     |  /|\
    *     K  J     G C H I
    *    / \         |   |
    *   N   M        O   L
    */
 
    Node root = new Node('A');
    (root.child).add(new Node('B'));
    (root.child).add(new Node('F'));
    (root.child).add(new Node('D'));
    (root.child).add(new Node('E'));
    (root.child.get(0).child).add(new Node('K'));
    (root.child.get(0).child).add(new Node('J'));
    (root.child.get(2).child).add(new Node('G'));
    (root.child.get(3).child).add(new Node('C'));
    (root.child.get(3).child).add(new Node('H'));
    (root.child.get(3).child).add(new Node('I'));
    (root.child.get(0).child.get(0).child).add(new Node('N'));
    (root.child.get(0).child.get(0).child).add(new Node('M'));
    (root.child.get(3).child.get(0).child).add(new Node('O'));
    (root.child.get(3).child.get(2).child).add(new Node('L'));
 
    traverse_tree(root);
}
}
 
// This code is contributed by sanjeev2552


Python3
# Python3 program to find height of
# full binary tree
# using preorder
 
class newNode():
   
    def __init__(self, key):
        self.key = key
        # all children are stored in a list
        self.child =[]
         
# Function to traverse tree without recursion
def traverse_tree(root):
  
    # Stack to store the nodes
    nodes=[]
 
    # push the current node onto the stack
    nodes.append(root)
   
    # loop while the stack is not empty
    while (len(nodes)): 
   
        # store the current node and pop it from the stack
        curr = nodes[0]
        nodes.pop(0)
   
        # current node has been travarsed
        print(curr.key,end=" ")
        # store all the childrent of current node from
        # right to left.
        for it in range(len(curr.child)-1,-1,-1): 
            nodes.insert(0,curr.child[it])
  
          
# Driver program to test above functions
if __name__ == '__main__':
    """   Let us create below tree 
   *            A 
   *        /  / \  \ 
   *       B  F   D  E 
   *      / \     |  /|\ 
   *     K  J     G C H I 
   *    / \         |   | 
   *   N   M        O   L 
   """
    root = newNode('A')
    (root.child).append(newNode('B'))
    (root.child).append(newNode('F'))
    (root.child).append(newNode('D'))
    (root.child).append(newNode('E'))
    (root.child[0].child).append(newNode('K'))
    (root.child[0].child).append(newNode('J'))
    (root.child[2].child).append(newNode('G'))
    (root.child[3].child).append(newNode('C'))
    (root.child[3].child).append(newNode('H'))
    (root.child[3].child).append(newNode('I'))
    (root.child[0].child[0].child).append(newNode('N'))
    (root.child[0].child[0].child).append(newNode('M'))
    (root.child[3].child[0].child).append(newNode('O'))
    (root.child[3].child[2].child).append(newNode('L'))
   
    traverse_tree(root)
  
# This code is contributed by SHUBHAMSINGH10


C#
// C# program to traverse an N-ary tree
// without recursion
using System;
using System.Collections.Generic;
 
public class GFG{
 
// Structure of a node of
// an n-ary tree
public class Node
{
    public char key;
    public List child;
 
    public Node(char key)
    {
        this.key = key;
        child = new List();
    }
};
 
// Function to traverse tree without recursion
static void traverse_tree(Node root)
{
     
    // Stack to store the nodes
    Stack nodes = new Stack();
 
    // push the current node onto the stack
    nodes.Push(root);
 
    // Loop while the stack is not empty
    while (nodes.Count!=0)
    {
         
        // Store the current node and pop
        // it from the stack
        Node curr = nodes.Pop();
 
        // Current node has been travarsed
        if (curr != null)
        {
            Console.Write(curr.key + " ");
 
            // Store all the childrent of
            // current node from right to left.
            for(int i = curr.child.Count - 1; i >= 0; i--)
            {
                nodes.Push(curr.child[i]);
            }
        }
    }
}
 
// Driver code
public static void Main(String[] args)
{
     
    /*   Let us create below tree
    *            A
    *        /  / \  \
    *       B  F   D  E
    *      / \     |  /|\
    *     K  J     G C H I
    *    / \         |   |
    *   N   M        O   L
    */
 
    Node root = new Node('A');
    (root.child).Add(new Node('B'));
    (root.child).Add(new Node('F'));
    (root.child).Add(new Node('D'));
    (root.child).Add(new Node('E'));
    (root.child[0].child).Add(new Node('K'));
    (root.child[0].child).Add(new Node('J'));
    (root.child[2].child).Add(new Node('G'));
    (root.child[3].child).Add(new Node('C'));
    (root.child[3].child).Add(new Node('H'));
    (root.child[3].child).Add(new Node('I'));
    (root.child[0].child[0].child).Add(new Node('N'));
    (root.child[0].child[0].child).Add(new Node('M'));
    (root.child[3].child[0].child).Add(new Node('O'));
    (root.child[3].child[2].child).Add(new Node('L'));
 
    traverse_tree(root);
}
}
 
// This code contributed by shikhasingrajput


Javascript


输出:
A B K N M J F D G E C O H I L