📜  二叉树的顺时针螺旋遍历套装– 2

📅  最后修改于: 2021-05-31 19:28:22             🧑  作者: Mango

给定二叉树。任务是打印给定二叉树的圆形顺时针螺旋阶遍历。

例子:

Input : 
           1
         /  \
        2    3
       / \    \
      4   5    6
         /    / \
        7    8   9
Output :1 9 8 7 2 3 6 5 4

Input :
           20
         /   \
        8     22
      /   \  /   \
     5     3 4    25
          / \
         10  14
Output :20 14 10 8 22 25 4 3 5

我们已经讨论了使用2D数组进行二叉树的顺时针螺旋遍历,这里将讨论另一种不使用2D数组的方法。

方法:想法是使用两个变量i初始化为1,j初始化为树的高度,并运行while循环,直到i大于j时,它才会中断。我们将使用另一个变量标志并将其初始化为0。现在在while循环中,我们将检查以下条件:如果flag等于0,则将从左到右遍历树并将标志标记为1,以便下次我们遍历树从右到左,然后增加i的值,以便下次我们访问位于当前级别之下的级别。同样,当我们从底部遍历该级别时,会将标记标记为0,以便下次我们从右向左遍历该树,然后递减j的值,以便下次访问该级别时才刚好高于当前级别。重复整个过程,直到遍历二叉树为止。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Binary tree node
struct Node {
    struct Node* left;
    struct Node* right;
    int data;
  
    Node(int data)
    {
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
};
  
// Recursive Function to find height
// of binary tree
int height(struct Node* root)
{
    // Base condition
    if (root == NULL)
        return 0;
  
    // Compute the height of each subtree
    int lheight = height(root->left);
    int rheight = height(root->right);
  
    // Return the maximum of two
    return max(1 + lheight, 1 + rheight);
}
  
// Function to Print Nodes from left to right
void leftToRight(struct Node* root, int level)
{
    if (root == NULL)
        return;
  
    if (level == 1)
        cout << root->data << " ";
  
    else if (level > 1) {
        leftToRight(root->left, level - 1);
        leftToRight(root->right, level - 1);
    }
}
  
// Function to Print Nodes from right to left
void rightToLeft(struct Node* root, int level)
{
    if (root == NULL)
        return;
  
    if (level == 1)
        cout << root->data << " ";
  
    else if (level > 1) {
        rightToLeft(root->right, level - 1);
        rightToLeft(root->left, level - 1);
    }
}
  
// Function to print clockwise spiral
// traversal of a binary tree without using 2D array
void ClockWiseSpiral(struct Node* root)
{
    int i = 1;
    int j = height(root);
  
    // Flag to mark a change in the direction
    // of printing nodes
    int flag = 0;
    while (i <= j) {
  
        // If flag is zero print nodes
        // from left to right
        if (flag == 0) {
            leftToRight(root, i);
  
            // Set the value of flag as zero
            // so that nodes are next time
            // printed from right to left
            flag = 1;
  
            // Increment i
            i++;
        }
  
        // If flag is one print nodes
        // from right to left
        else {
            rightToLeft(root, j);
  
            // Set the value of flag as zero
            // so that nodes are next time
            // printed from left to right
            flag = 0;
  
            // Decrement j
            j--;
        }
    }
}
  
// Driver code
int main()
{
    struct Node* root = new Node(10);
  
    root->left = new Node(12);
    root->right = new Node(13);
  
    root->right->left = new Node(14);
    root->right->right = new Node(15);
  
    root->right->left->left = new Node(21);
    root->right->left->right = new Node(22);
    root->right->right->left = new Node(23);
    root->right->right->right = new Node(24);
  
    ClockWiseSpiral(root);
  
    return 0;
}


Java
// Java implementation of the approach 
class GfG 
{ 
  
// Binary tree node 
static class Node 
{ 
    Node left; 
    Node right; 
    int data; 
  
    Node(int data) 
    { 
        this.data = data; 
        this.left = null; 
        this.right = null; 
    } 
} 
  
// Recursive Function to find height 
// of binary tree 
static int height(Node root) 
{ 
    // Base condition 
    if (root == null) 
        return 0; 
  
    // Compute the height of each subtree 
    int lheight = height(root.left); 
    int rheight = height(root.right); 
  
    // Return the maximum of two 
    return Math.max(1 + lheight, 1 + rheight); 
} 
  
// Function to Print Nodes from left to right 
static void leftToRight(Node root, int level) 
{ 
    if (root == null) 
        return; 
  
    if (level == 1) 
        System.out.print(root.data + " "); 
  
    else if (level > 1)
    { 
        leftToRight(root.left, level - 1); 
        leftToRight(root.right, level - 1); 
    } 
} 
  
// Function to Print Nodes from right to left 
static void rightToLeft(Node root, int level) 
{ 
    if (root == null) 
        return; 
  
    if (level == 1) 
        System.out.print(root.data + " "); 
  
    else if (level > 1)
    { 
        rightToLeft(root.right, level - 1); 
        rightToLeft(root.left, level - 1); 
    } 
} 
  
// Function to print clockwise spiral 
// traversal of a binary tree without using 2D array 
static void ClockWiseSpiral(Node root) 
{ 
    int i = 1; 
    int j = height(root); 
  
    // Flag to mark a change in the direction 
    // of printing nodes 
    int flag = 0; 
    while (i <= j) 
    { 
  
        // If flag is zero print nodes 
        // from left to right 
        if (flag == 0) 
        { 
            leftToRight(root, i); 
  
            // Set the value of flag as zero 
            // so that nodes are next time 
            // printed from right to left 
            flag = 1; 
  
            // Increment i 
            i++; 
        } 
  
        // If flag is one print nodes 
        // from right to left 
        else
        { 
            rightToLeft(root, j); 
  
            // Set the value of flag as zero 
            // so that nodes are next time 
            // printed from left to right 
            flag = 0; 
  
            // Decrement j 
            j--; 
        } 
    } 
} 
  
// Driver code 
public static void main(String[] args) 
{ 
    Node root = new Node(10); 
  
    root.left = new Node(12); 
    root.right = new Node(13); 
  
    root.right.left = new Node(14); 
    root.right.right = new Node(15); 
  
    root.right.left.left = new Node(21); 
    root.right.left.right = new Node(22); 
    root.right.right.left = new Node(23); 
    root.right.right.right = new Node(24); 
  
    ClockWiseSpiral(root); 
} 
} 
  
// This code is contributed by Prerna Saini


Python3
# Python3 implementation of the approach 
  
# Binary tree 
class Node: 
      
    # Constructor to create a new node 
    def __init__(self, data): 
        self.data = data 
        self.left = self.right = None
  
# Recursive Function to find height 
# of binary tree 
def height(root):
      
    # Base condition 
    if (root == None):
        return 0
          
    # Compute the height of each subtree 
    lheight = height(root.left) 
    rheight = height(root.right) 
      
    # Return the maximum of two 
    return max(1 + lheight, 1 + rheight) 
      
# Function to Print Nodes from left to right 
def leftToRight(root, level):
    if (root == None):
        return
    if (level == 1):
        print(root.data, end = " ")
      
    elif (level > 1):
        leftToRight(root.left, level - 1) 
        leftToRight(root.right, level - 1) 
          
# Function to Print Nodes from right to left 
def rightToLeft(root, level):
    if (root == None):
        return
    if (level == 1):
        print(root.data ,end=" ")
      
    elif (level > 1):
        rightToLeft(root.right, level - 1) 
        rightToLeft(root.left, level - 1) 
  
# Function to print clockwise spiral 
# traversal of a binary tree without using 2D array 
def ClockWiseSpiral(root):
      
    i = 1
    j = height(root) 
      
    # Flag to mark a change in the direction 
    # of printing nodes 
    flag = 0
    while (i <= j):
          
        # If flag is zero print nodes 
        # from left to right 
        if (flag == 0) :
            leftToRight(root, i) 
              
            # Set the value of flag as zero 
            # so that nodes are next time 
            # printed from right to left 
            flag = 1
              
            # Increment i 
            i += 1
          
        # If flag is one print nodes 
        # from right to left 
        else:
            rightToLeft(root, j) 
              
            # Set the value of flag as zero 
            # so that nodes are next time 
            # printed from left to right 
            flag = 0
              
            # Decrement j
            j -= 1
  
# Driver code 
  
root = Node(10) 
  
root.left = Node(12) 
root.right = Node(13) 
  
root.right.left = Node(14) 
root.right.right = Node(15) 
  
root.right.left.left = Node(21) 
root.right.left.right = Node(22) 
root.right.right.left = Node(23) 
root.right.right.right = Node(24) 
  
ClockWiseSpiral(root) 
  
# This code is contributed by SHUBHAMSINGH10


C#
// C# implementation of the approach 
using System;
using System.Collections.Generic;
  
class GfG 
{ 
  
// Binary tree node 
public class Node 
{ 
    public Node left; 
    public Node right; 
    public int data; 
  
    public Node(int data) 
    { 
        this.data = data; 
        this.left = null; 
        this.right = null; 
    } 
} 
  
// Recursive Function to find height 
// of binary tree 
static int height(Node root) 
{ 
    // Base condition 
    if (root == null) 
        return 0; 
  
    // Compute the height of each subtree 
    int lheight = height(root.left); 
    int rheight = height(root.right); 
  
    // Return the maximum of two 
    return Math.Max(1 + lheight, 1 + rheight); 
} 
  
// Function to Print Nodes from left to right 
static void leftToRight(Node root, int level) 
{ 
    if (root == null) 
        return; 
  
    if (level == 1) 
        Console.Write(root.data + " "); 
  
    else if (level > 1) 
    { 
        leftToRight(root.left, level - 1); 
        leftToRight(root.right, level - 1); 
    } 
} 
  
// Function to Print Nodes from right to left 
static void rightToLeft(Node root, int level) 
{ 
    if (root == null) 
        return; 
  
    if (level == 1) 
        Console.Write(root.data + " "); 
  
    else if (level > 1) 
    { 
        rightToLeft(root.right, level - 1); 
        rightToLeft(root.left, level - 1); 
    } 
} 
  
// Function to print clockwise spiral 
// traversal of a binary tree without using 2D array 
static void ClockWiseSpiral(Node root) 
{ 
    int i = 1; 
    int j = height(root); 
  
    // Flag to mark a change in the direction 
    // of printing nodes 
    int flag = 0; 
    while (i <= j) 
    { 
  
        // If flag is zero print nodes 
        // from left to right 
        if (flag == 0) 
        { 
            leftToRight(root, i); 
  
            // Set the value of flag as zero 
            // so that nodes are next time 
            // printed from right to left 
            flag = 1; 
  
            // Increment i 
            i++; 
        } 
  
        // If flag is one print nodes 
        // from right to left 
        else
        { 
            rightToLeft(root, j); 
  
            // Set the value of flag as zero 
            // so that nodes are next time 
            // printed from left to right 
            flag = 0; 
  
            // Decrement j 
            j--; 
        } 
    } 
} 
  
// Driver code 
public static void Main(String[] args) 
{ 
    Node root = new Node(10); 
  
    root.left = new Node(12); 
    root.right = new Node(13); 
  
    root.right.left = new Node(14); 
    root.right.right = new Node(15); 
  
    root.right.left.left = new Node(21); 
    root.right.left.right = new Node(22); 
    root.right.right.left = new Node(23); 
    root.right.right.right = new Node(24); 
  
    ClockWiseSpiral(root); 
} 
} 
  
/* This code contributed by PrinciRaj1992 */


输出:
10 24 23 22 21 12 13 15 14

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。