Итерационный подход к проверке совершенства двоичного дерева
Учитывая двоичное дерево , задача состоит в том, чтобы проверить, является ли данное двоичное дерево идеальным двоичным деревом или нет.
Двоичное дерево - это идеальное двоичное дерево, в котором все внутренние узлы имеют двух дочерних элементов, а все листья находятся на одном уровне.
Примеры:
Вход :
1
/
2 3
/ /
4 5 6 7
Выход: Да
Вход :
20
/
8 22
/ /
5 3 4 25
/ /
1 10 2 14 6
Выход: Нет
Один листовой узел со значением 4 отсутствует в
последний уровень и узел со значением 25 имеет
только один ребенок.
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Мы уже обсуждали рекурсивный подход. В этом посте обсуждается итеративный подход.
Подход: идея состоит в том, чтобы использовать очередь и флаг переменной, инициализированный нулем, чтобы проверить, был ли обнаружен листовой узел. Мы проверим:
- Если текущий узел имеет двух дочерних узлов, мы проверим значение flag . Если значение flag равно нулю, тогда нажмите левый и правый дочерние элементы в очереди, но если значение flag равно единице, тогда верните false, потому что тогда это означает, что листовой узел уже найден, а в идеальном двоичном дереве все листовые узлы должен присутствовать на последнем уровне, никакой листовой узел не должен присутствовать на любом другом уровне.
- Если текущий узел не имеет дочернего узла, это означает, что это листовой узел, отметьте флаг как единицу.
- Если текущий узел имеет только один дочерний элемент, верните false, так как в идеальном двоичном дереве все узлы имеют двух дочерних узлов, за исключением конечных узлов, которые должны присутствовать на последнем уровне дерева.
Below is the implementation of the above approach:
C++
// C++ program to check if the// given binary tree is perfect#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 to check if the given tree is perfectbool CheckPerfectTree(Node* root){ queue<Node*> q; // Push the root node q.push(root); // Flag to check if leaf nodes have been found int flag = 0; while (!q.empty()) { Node* temp = q.front(); q.pop(); // If current node has both left and right child if (temp->left && temp->right) { // If a leaf node has already been found // then return false if (flag == 1) return false; // If a leaf node has not been discovered yet // push the left and right child in the queue else { q.push(temp->left); q.push(temp->right); } } // If a leaf node is found mark flag as one else if (!temp->left && !temp->right) { flag = 1; } // If the current node has only one child // then return false else if (!temp->left || !temp->right) return false; } // If the given tree is perfect return true return true;} // Driver codeint main(){ Node* root = newNode(7); root->left = newNode(5); root->right = newNode(6); root->left->left = newNode(8); root->left->right = newNode(1); root->right->left = newNode(3); root->right->right = newNode(9); root->right->right->right = newNode(13); root->right->right->left = newNode(10); if (CheckPerfectTree(root)) printf("Yes"); else printf("No"); return 0;} |
Java
// Java program to check if the // given binary tree is perfect import java.util.*; class GFG{ // 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 to check if the given tree is perfect static boolean CheckPerfectTree(Node root) { Queue<Node> q = new LinkedList<Node>(); // add the root node q.add(root); // Flag to check if leaf nodes have been found int flag = 0; while (q.size() > 0) { Node temp = q.peek(); q.remove(); // If current node has both left and right child if (temp.left != null && temp.right != null) { // If a leaf node has already been found // then return false if (flag == 1) return false; // If a leaf node has not been discovered yet // add the left and right child in the queue else { q.add(temp.left); q.add(temp.right); } } // If a leaf node is found mark flag as one else if (temp.left == null && temp.right == null) { flag = 1; } // If the current node has only one child // then return false else if (temp.left == null || temp.right == null) return false; } // If the given tree is perfect return true return true; } // Driver code public static void main(String args[]){ Node root = newNode(7); root.left = newNode(5); root.right = newNode(6); root.left.left = newNode(8); root.left.right = newNode(1); root.right.left = newNode(3); root.right.right = newNode(9); root.right.right.right = newNode(13); root.right.right.left = newNode(10); if (CheckPerfectTree(root)) System.out.printf("Yes"); else System.out.printf("No"); } } // This code is contributed by Arnab Kundu |
Python3
# Python3 program to check if the # given binary tree is perfect import sysimport math # A binary tree nodeclass Node: def __init__(self, data): self.data = data self.left = None self.right = None # Utility function to allocate # memory for a new node def newNode(data): return Node(data) # Function to check if the # given tree is perfectdef CheckPerfectTree(root): q = [] # Push the root node q.append(root) # Flag to check if leaf nodes # have been found flag = 0 while(q): temp = q[0] q.pop(0) # If current node has both # left and right child if (temp.left and temp.right): # If a leaf node has already been found # then return false if (flag == 1): return False # If a leaf node has not been discovered yet # push the left and right child in the queue else: q.append(temp.left) q.append(temp.right) # If a leaf node is found # mark flag as one elif(not temp.left and not temp.right): flag = 1 # If the current node has only one child # then return false elif(not temp.left or not temp.right): return False # If the given tree is perfect # return true return True # Driver Codeif __name__=="__main__": root = newNode(7) root.left = newNode(5) root.left.left = newNode(8) root.left.right = newNode(1) root.right = newNode(6) root.right.left = newNode(3) root.right.right = newNode(9) root.right.right.left = newNode(10) root.right.right.right = newNode(13) if CheckPerfectTree(root): print("Yes") else: print("No") # This code is contributed# by Vikash Kumar 37 |
C#
// C# program to check if the // given binary tree is perfectusing System;using System.Collections.Generic; class GFG{ // A binary tree node public class Node { public int data; public 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 to check if the given tree is perfect static Boolean CheckPerfectTree(Node root) { Queue<Node > q = new Queue<Node>(); // add the root node q.Enqueue(root); // Flag to check if leaf nodes // have been found int flag = 0; while (q.Count > 0) { Node temp = q.Peek(); q.Dequeue(); // If current node has both // left and right child if (temp.left != null && temp.right != null) { // If a leaf node has already been found // then return false if (flag == 1) return false; // If a leaf node has not been discovered yet // add the left and right child in the queue else { q.Enqueue(temp.left); q.Enqueue(temp.right); } } // If a leaf node is found mark flag as one else if (temp.left == null && temp.right == null) { flag = 1; } // If the current node has only one child // then return false else if (temp.left == null || temp.right == null) return false; } // If the given tree is perfect return true return true; } // Driver code public static void Main(String []args){ Node root = newNode(7); root.left = newNode(5); root.right = newNode(6); root.left.left = newNode(8); root.left.right = newNode(1); root.right.left = newNode(3); root.right.right = newNode(9); root.right.right.right = newNode(13); root.right.right.left = newNode(10); if (CheckPerfectTree(root)) Console.WriteLine("Yes"); else Console.WriteLine("No"); } } // This code is contributed by Rajput-Ji |
No
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.