📜  二叉树的边界级顺序遍历

📅  最后修改于: 2021-09-04 09:35:32             🧑  作者: Mango

给定一棵二叉树,任务是在边界层顺序遍历中打印这棵树的所有层。

例子:

Input: 
                   1
                /    \ 
              12       13 
             /  \     /   \ 
            11    6  4    11 
           /     /  \     / \
         23     7    9   2   4
Output:
1
12 13
11 11 6 4
23 4 7 2 9

Input: 
                  7
                /  \ 
              22     19
             /  \      \
            3     6     13 
           / \     \    / \
          1   5     8  1   4  
                   /
                  23 
Output:
7
22 19
3 13 6
1 4 5 1 8
23

方法:

  • 为了在 Boundary Level order traversal 中打印 level,我们需要先对二叉树进行 Level Order Traversal 来获取每个 level 的值。
  • 这里队列数据结构用于在执行级别顺序遍历时存储树的级别。
  • 然后对于每个级别,首先打印级别的第一个元素(起始边界),然后是最后一个元素(结束边界)。然后对第二个和最后一个元素重复该过程,直到打印出完整的关卡。

下面是上述方法的实现:

C++
// C++ program for printing a
// Levels of Binary Tree in a
// start end fashion
 
#include 
using namespace std;
 
// A Tree node
struct Node {
    int key;
    struct Node *left, *right;
};
 
// Utility function to create a new node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
 
// Utility function to print level in
// start end fashion
void printLevelUtil(struct Node* queue[],
                    int index, int size)
{
    while (index < size) {
        cout << queue[index++]->key << " "
             << queue[size--]->key << " ";
    }
    if (index == size) {
        cout << queue[index]->key << " ";
    }
 
    cout << endl;
}
 
// Utility function to print level in  start
// end fashion in a given Binary tree
void printLevel(struct Node* node,
                struct Node* queue[],
                int index, int size)
{
 
    // Print root node value
    // as a single value in a
    // binary tree
    cout << queue[index]->key << endl;
 
    // Level order traversal of Tree
    while (index < size) {
        int curr_size = size;
        while (index < curr_size) {
            struct Node* temp = queue[index];
 
            if (temp->left != NULL) {
                queue[size++] = temp->left;
            }
 
            if (temp->right != NULL) {
                queue[size++] = temp->right;
            }
 
            index++;
        }
 
        // Print level in a desire fashion
        printLevelUtil(queue, index, size - 1);
    }
}
 
// Function to find total no of nodes
int findSize(struct Node* node)
{
 
    if (node == NULL)
        return 0;
 
    return 1
           + findSize(node->left)
           + findSize(node->right);
}
 
// Function to print level in start end
// fashion in a given binary tree
void printLevelInStartEndFashion(
    struct Node* node)
{
    int t_size = findSize(node);
    struct Node* queue[t_size];
    queue[0] = node;
    printLevel(node, queue, 0, 1);
}
 
// Driver Code
int main()
{
    /*     10
           / \
         13   13
          /     \
        14       15
        / \     / \
       21 22   22 21
                  /
                 8 */
 
    // Create Binary Tree as shown
    Node* root = newNode(10);
    root->left = newNode(13);
    root->right = newNode(13);
 
    root->right->left = newNode(14);
    root->right->right = newNode(15);
 
    root->right->left->left = newNode(21);
    root->right->left->right = newNode(22);
    root->right->right->left = newNode(22);
    root->right->right->right = newNode(21);
    root->right->right->right->left = newNode(8);
 
    // Print Levels In Start End Fashion
    printLevelInStartEndFashion(root);
 
    return 0;
}


Java
// Java program for printing a
// Levels of Binary Tree in a
// start end fashion
class GFG{
  
// A Tree node
static class Node {
    int key;
    Node left, right;
};
  
// Utility function to create a new node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return (temp);
}
  
// Utility function to print level in
// start end fashion
static void printLevelUtil(Node queue[],
                    int index, int size)
{
    while (index < size) {
        System.out.print(queue[index++].key+ " "
             + queue[size--].key+ " ");
    }
    if (index == size) {
        System.out.print(queue[index].key+ " ");
    }
  
    System.out.println();
}
  
// Utility function to print level in  start
// end fashion in a given Binary tree
static void printLevel(Node node,
                Node queue[],
                int index, int size)
{
  
    // Print root node value
    // as a single value in a
    // binary tree
    System.out.print(queue[index].key +"\n");
  
    // Level order traversal of Tree
    while (index < size) {
        int curr_size = size;
        while (index < curr_size) {
            Node temp = queue[index];
  
            if (temp.left != null) {
                queue[size++] = temp.left;
            }
  
            if (temp.right != null) {
                queue[size++] = temp.right;
            }
  
            index++;
        }
  
        // Print level in a desire fashion
        printLevelUtil(queue, index, size - 1);
    }
}
  
// Function to find total no of nodes
static int findSize(Node node)
{
  
    if (node == null)
        return 0;
  
    return 1
           + findSize(node.left)
           + findSize(node.right);
}
  
// Function to print level in start end
// fashion in a given binary tree
static void printLevelInStartEndFashion(
    Node node)
{
    int t_size = findSize(node);
    Node []queue = new Node[t_size];
    queue[0] = node;
    printLevel(node, queue, 0, 1);
}
  
// Driver Code
public static void main(String[] args)
{
    /*     10
           / \
         13   13
          /     \
        14       15
        / \     / \
       21 22   22 21
                  /
                 8 */
  
    // Create Binary Tree as shown
    Node root = newNode(10);
    root.left = newNode(13);
    root.right = newNode(13);
  
    root.right.left = newNode(14);
    root.right.right = newNode(15);
  
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(22);
    root.right.right.left = newNode(22);
    root.right.right.right = newNode(21);
    root.right.right.right.left = newNode(8);
  
    // Print Levels In Start End Fashion
    printLevelInStartEndFashion(root);
  
}
}
 
// This code is contributed by Princi Singh


Python3
# Python3 program for printing a
# Levels of Binary Tree in a
# start end fashion
  
# A Tree node
class Node:
     
    def __init__(self, key):
       
        self.key = key
        self.left = None
        self.right = None
         
# function to create a
# new node
def newNode(key):
 
    temp = Node(key);   
    return temp;
 
  
# Utility function to print
# level in start end fashion
def printLevelUtil(queue,
                   index, size):
 
    while (index < size):
        print(str(queue[index].key) + ' ' +
              str(queue[size].key), end = ' ')
        size -= 1
        index += 1
     
    if (index == size):
        print(queue[index].key,
              end = ' ')   
    print()
  
# Utility function to print
# level in  start end fashion
# in a given Binary tree
def printLevel(node, queue,
               index, size):
  
    # Print root node value
    # as a single value in a
    # binary tree
    print(queue[index].key)
  
    # Level order traversal
    # of Tree
    while (index < size):
        curr_size = size;       
        while (index < curr_size):
            temp = queue[index];
            if (temp.left != None):
                queue[size] = temp.left;
                size += 1
            if (temp.right != None):
                queue[size] = temp.right;
                size += 1
          
            index += 1   
  
        # Print level in a desire
        # fashion
        printLevelUtil(queue, index,
                       size - 1);   
  
# Function to find total
# no of nodes
def findSize(node):
  
    if (node == None):
        return 0;
  
    return (1 + findSize(node.left) +
                findSize(node.right));
 
# Function to print level in start
# end fashion in a given binary tree
def printLevelInStartEndFashion(node):
 
    t_size = findSize(node);
    queue=[0 for i in range(t_size)];
    queue[0] = node;
    printLevel(node, queue, 0, 1);
 
# Driver code   
if __name__=="__main__":
     
    '''     10
           / \
         13   13
          /     \
        14       15
        / \     / \
       21 22   22 21
                  /
                 8 '''
  
    # Create Binary Tree as shown
    root = newNode(10);
    root.left = newNode(13);
    root.right = newNode(13);
  
    root.right.left = newNode(14);
    root.right.right = newNode(15);
  
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(22);
    root.right.right.left = newNode(22);
    root.right.right.right = newNode(21);
    root.right.right.right.left = newNode(8);
  
    # Print Levels In Start End Fashion
    printLevelInStartEndFashion(root);
 
# This code is contributed by Rutvik_56


C#
// C# program for printing a
// Levels of Binary Tree in a
// start end fashion
using System;
 
class GFG{
   
// A Tree node
class Node {
    public int key;
    public Node left, right;
};
   
// Utility function to create a new node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return (temp);
}
   
// Utility function to print level in
// start end fashion
static void printLevelUtil(Node []queue,
                    int index, int size)
{
    while (index < size) {
        Console.Write(queue[index++].key+ " "
             + queue[size--].key+ " ");
    }
    if (index == size) {
        Console.Write(queue[index].key+ " ");
    }
   
    Console.WriteLine();
}
   
// Utility function to print level in  start
// end fashion in a given Binary tree
static void printLevel(Node node,
                Node []queue,
                int index, int size)
{
   
    // Print root node value
    // as a single value in a
    // binary tree
    Console.Write(queue[index].key +"\n");
   
    // Level order traversal of Tree
    while (index < size) {
        int curr_size = size;
        while (index < curr_size) {
            Node temp = queue[index];
   
            if (temp.left != null) {
                queue[size++] = temp.left;
            }
   
            if (temp.right != null) {
                queue[size++] = temp.right;
            }
   
            index++;
        }
   
        // Print level in a desire fashion
        printLevelUtil(queue, index, size - 1);
    }
}
   
// Function to find total no of nodes
static int findSize(Node node)
{
   
    if (node == null)
        return 0;
   
    return 1
           + findSize(node.left)
           + findSize(node.right);
}
   
// Function to print level in start end
// fashion in a given binary tree
static void printLevelInStartEndFashion(
    Node node)
{
    int t_size = findSize(node);
    Node []queue = new Node[t_size];
    queue[0] = node;
    printLevel(node, queue, 0, 1);
}
   
// Driver Code
public static void Main(String[] args)
{
    /*     10
           / \
         13   13
          /     \
        14       15
        / \     / \
       21 22   22 21
                  /
                 8 */
   
    // Create Binary Tree as shown
    Node root = newNode(10);
    root.left = newNode(13);
    root.right = newNode(13);
   
    root.right.left = newNode(14);
    root.right.right = newNode(15);
   
    root.right.left.left = newNode(21);
    root.right.left.right = newNode(22);
    root.right.right.left = newNode(22);
    root.right.right.right = newNode(21);
    root.right.right.right.left = newNode(8);
   
    // Print Levels In Start End Fashion
    printLevelInStartEndFashion(root);
}
}
 
// This code is contributed by PrinciRaj1992


输出:
10
13 13 
14 15 
21 21 22 22 
8

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live