Рекурсивная программа для печати крайних узлов каждого уровня двоичного дерева в альтернативном порядке
Опубликовано: 23 Января, 2022
Учитывая двоичное дерево, задача состоит в том, чтобы распечатать узлы крайних углов каждого уровня, но в другом порядке.
Примеры:
Вход :
1
/
2 3
/ /
4 5 6
/ /
7 8 9
Выход: 1 2 6 7
Выведите крайний правый узел 1-го уровня: 1
Выведите крайний левый узел на 2-м уровне: 2
Выведите крайний правый узел на 3-м уровне: 6
Выведите крайний левый узел на 4-м уровне: 7
Другой возможный вывод будет -> 1 3 4 9
Вход :
3
/
8 1
/ /
9 5 6 4
Выход: 3 8 4
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Мы уже обсуждали итерационный подход к решению этой проблемы. В этом посте обсуждается рекурсивный подход.
Подход: идея состоит в том, чтобы выполнить обход порядка уровней в спиральной форме и на каждом уровне распечатать первый узел во время обхода, это будут узлы в крайнем углу, присутствующие в альтернативной форме.
Below is the implementation of the above approach:
C++
// C++ program to print nodes of extreme corners// of each level in alternate order #include <bits/stdc++.h>using namespace std; // A binary tree nodestruct Node { int data; Node *left, *right;}; // Utility function to allocate memory for a new nodeNode* newNode(int data){ Node* node = new (Node); node->data = data; node->left = node->right = NULL; return (node);} // Function that returns the height of the binary treeint height(Node* root){ if (root == NULL) return 0; int lheight = height(root->left); int rheight = height(root->right); return max(lheight, rheight) + 1;} // Function performs level order traversal from right to// left and prints the first node during the traversalvoid rightToLeft(Node* root, int level, int& f){ if (root == NULL) return; // Checks for the value of f so that // only first node is printed during // the traversal and no other node is printed if (level == 1 && f == 0) { printf("%d ", root->data); f = 1; } else if (level > 1) { rightToLeft(root->right, level - 1, f); rightToLeft(root->left, level - 1, f); }} // Function performs level order traversal from left to// right and prints the first node during the traversalvoid leftToRight(Node* root, int level, int& f){ if (root == NULL) return; // Checks for the value of f so that // only first node is printed during // the traversal and no other node is printed if (level == 1 && f == 1) { printf("%d ", root->data); f = 0; } else if (level > 1) { leftToRight(root->left, level - 1, f); leftToRight(root->right, level - 1, f); }} // Function to print the extreme nodes of// a given binary treevoid printExtremeNodes(Node* root){ // Stores height of binary tree int h = height(root); // Flag to mark the change in level int flag = 0; // To check if the extreme node of a // particular level has been visited int f = 0; for (int i = 1; i <= h; i++) { // If flag is zero then traverse from // right to left at the given level and // print the first node during the traversal if (flag == 0) { rightToLeft(root, i, f); flag = 1; } // If flag is one then traverse from // left to right at the given level and // print the first node during the traversal else if (flag == 1) { leftToRight(root, i, f); flag = 0; } } return;} // Driver codeint main(){ Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); root->right->right = newNode(7); root->left->left->left = newNode(8); root->left->left->right = newNode(9); root->left->right->left = newNode(10); root->left->right->right = newNode(11); root->right->right->left = newNode(14); root->right->right->right = newNode(15); root->left->left->left->left = newNode(16); root->left->left->left->right = newNode(17); root->right->right->right->right = newNode(31); printExtremeNodes(root); return 0;} |
Java
// Java program to print nodes of extreme corners // of each level in alternate order import java.util.*; class GFG{ //INT classstatic class INT{ int a;} // A binary tree node static class Node { int data; Node left, right; }; // Utility function to allocate memory for a new node static Node newNode(int data) { Node node = new Node(); node.data = data; node.left = node.right = null; return (node); } // Function that returns the height of the binary tree static int height(Node root) { if (root == null) return 0; int lheight = height(root.left); int rheight = height(root.right); return Math.max(lheight, rheight) + 1; } // Function performs level order traversal from right to // left and prints the first node during the traversal static void rightToLeft(Node root, int level, INT f) { if (root == null) return; // Checks for the value of f so that // only first node is printed during // the traversal and no other node is printed if (level == 1 && f.a == 0) { System.out.printf("%d ", root.data); f.a = 1; } else if (level > 1) { rightToLeft(root.right, level - 1, f); rightToLeft(root.left, level - 1, f); } } // Function performs level order traversal from left to // right and prints the first node during the traversal static void leftToRight(Node root, int level, INT f) { if (root == null) return; // Checks for the value of f so that // only first node is printed during // the traversal and no other node is printed if (level == 1 && f.a == 1) { System.out.printf("%d ", root.data); f.a = 0; } else if (level > 1) { leftToRight(root.left, level - 1, f); leftToRight(root.right, level - 1, f); } } // Function to print the extreme nodes of // a given binary tree static void printExtremeNodes(Node root) { // Stores height of binary tree int h = height(root); // Flag to mark the change in level int flag = 0; // To check if the extreme node of a // particular level has been visited INT f=new INT(); f.a = 0; for (int i = 1; i <= h; i++) { // If flag is zero then traverse from // right to left at the given level and // print the first node during the traversal if (flag == 0) { rightToLeft(root, i, f); flag = 1; } // If flag is one then traverse from // left to right at the given level and // print the first node during the traversal else if (flag == 1) { leftToRight(root, i, f); flag = 0; } } return; } // Driver code public static void main(String args[]){ Node root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); root.right.right = newNode(7); root.left.left.left = newNode(8); root.left.left.right = newNode(9); root.left.right.left = newNode(10); root.left.right.right = newNode(11); root.right.right.left = newNode(14); root.right.right.right = newNode(15); root.left.left.left.left = newNode(16); root.left.left.left.right = newNode(17); root.right.right.right.right = newNode(31); printExtremeNodes(root); } } // This code is contributed by Arnab Kundu |
Python3
# Python3 program to print nodes of # extreme corners of each level in # alternate orderfrom collections import deque # A binary tree node has key, pointer to left# child and a pointer to right childclass Node: def __init__(self, key): self.data = key self.left = None self.right = None # Function that returns the height of# the binary treedef height(root: Node) -> int: if (root is None): return 0 lheight = height(root.left) rheight = height(root.right) return max(lheight, rheight) + 1 # Function performs level order traversal # from right to left and prints the first# node during the traversaldef rightToLeft(root: Node, level: int) -> int: global f if (root is None): return # Checks for the value of f so that # only first node is printed during # the traversal and no other node is printed if (level == 1 and f == 0): print("%d " % root.data, end = "") f = 1 elif (level > 1): rightToLeft(root.right, level - 1) rightToLeft(root.left, level - 1) # Function performs level order traversal # from left to right and prints the first # node during the traversaldef leftToRight(root: Node, level: int): global f if (root is None): return # Checks for the value of f so that # only first node is printed during # the traversal and no other node is printed if (level == 1 and f == 1): print("%d " % root.data, end = "") f = 0 elif (level > 1): leftToRight(root.left, level - 1) leftToRight(root.right, level - 1) # Function to print the extreme nodes of# a given binary treedef printExtremeNodes(root: Node): global f # Stores height of binary tree h = height(root) # Flag to mark the change in level flag = 0 # To check if the extreme node of a # particular level has been visited f = 0 for i in range(1, h + 1): # If flag is zero then traverse from # right to left at the given level and # print the first node during the traversal if (flag == 0): rightToLeft(root, i) flag = 1 # If flag is one then traverse from # left to right at the given level and # print the first node during the traversal elif (flag == 1): &nbs
РЕКОМЕНДУЕМЫЕ СТАТЬИ |