Проверить, принадлежат ли заданные обходы Preorder, Inorder и Postorder к одному дереву | Комплект 2
Опубликовано: 13 Января, 2022
Заданы обходы Preorder, Inorder и Postorder некоторого дерева. Задача - проверить, все ли они принадлежат к одному дереву.
Примеры:
Ввод: Inorder -> 4 2 5 1 3
Предзаказ -> 1 2 4 5 3
Отправитель -> 4 5 2 3 1
Выход: Да
Exaplanation : Все три вышеупомянутых обхода
такое же дерево. 1
/
2 3
/
4 5
Ввод: Inorder -> 4 2 5 1 3
Предзаказ -> 1 5 4 2 3
Отправитель -> 4 1 2 3 5
Выход: Нет Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Мы уже обсуждали подход к решению указанной выше проблемы путем построения дерева с использованием любых двух обходов в предыдущей статье.
В этой статье обсуждается подход без использования лишнего места.
Подход :
- Найдите первый элемент массива предварительного заказа в массиве inorder и сохраните его индекс как idx, если он не существует, верните False. Кроме того, проверьте, присутствует ли этот элемент в массиве postorder или нет. Если это не так, верните False.
- Все, начиная с 0-го индекса для inorder и postorder и с 1-го индекса для preorder длины idx, становится левым поддеревом для первого элемента массива preorder.
- Все, начиная с позиции idx + 1 для inorder и preorder и из idx для postorder длины ( length-idx-1 ), становится правым поддеревом для первого элемента массива preorder.
- Повторяйте шаги с 1 по 3 рекурсивно, пока длина массивов не станет равной 0 (в этом случае мы
return true) или 1 (в этом случае мы возвращаем True, только если все три массива равны, иначе False).
Below is the implementation of the above approach:
C++
// C++ program to check if the given// three traversals are of the same// tree or not#include <bits/stdc++.h>using namespace std;// Function to check if traversals are// of the same treeint checktree(int preorder[], int inorder[], int postorder[], int len){ // if the array lengths are 0, // then all of them are obviously equal if (len == 0) return 1; // if array lengths are 1, // then check if all of them are equal if (len == 1) return (preorder[0] == inorder[0]) && (inorder[0] == postorder[0]); // search for first element of preorder // in inorder array int idx = -1, f = 0; for (int i = 0; i < len; ++i) if (inorder[i] == preorder[0]) { idx = i; break; } if(idx != -1){ for(int i = 0; i < len; i++) if(preorder[0] == postorder[i]){f = 1; break;} } if (idx == -1 || f == 0) return 0; // check for the left subtree int ret1 = checktree(preorder + 1, inorder, postorder, idx); // check for the right subtree int ret2 = checktree(preorder + idx + 1, inorder + idx + 1, postorder + idx, len - idx - 1); // return 1 only if both of them are // correct else 0 return (ret1 && ret2);}// Driver Codeint main(){ // Traversal Arrays int inorder[] = { 4, 2, 5, 1, 3 }; int preorder[] = { 1, 2, 4, 5, 3 }; int postorder[] = { 4, 5, 2, 3, 1 }; int len1 = sizeof(inorder) / sizeof(inorder[0]); int len2 = sizeof(preorder) / sizeof(preorder[0]); int len3 = sizeof(postorder) / sizeof(postorder[0]); // Check if all the array lengths are equal if ((len1 == len2) && (len2 == len3)) { bool res = checktree(preorder, inorder, postorder, len1); (res) ? cout << "Yes" : cout << "No"; } else cout << "No
"; return 0;} |
Java
// Java program to check if the given// three traversals are of the same// tree or notclass GFG { // Function to check if traversals are // of the same tree static boolean checktree(int preorder[], int s, int inorder[], int s1, int postorder[], int s2, int len) { // if the array lengths are 0, // then all of them are obviously equal if (len == 0) return true; // if array lengths are 1, // then check if all of them are equal if (len == 1) return ((preorder[s] == inorder[s1]) && (inorder[s1] == postorder[s2])); // search for first element of preorder // in inorder array int idx = -1; for (int i = s1; i < s1 + len; ++i) if (inorder[i] == preorder[s]) { idx = i; break; } if (idx == -1) return false; idx = idx - s1; // check for the left subtree boolean ret1 = checktree(preorder, s + 1, inorder, s1, postorder, s2, idx); // check for the right subtree boolean ret2 = checktree( preorder, s + idx + 1, inorder, s1 + idx + 1, postorder, s2 + idx, len - idx - 1); // return 1 only if both of them are // correct else 0 return (ret1 && ret2); } // Driver Code public static void main(String args[]) { // Traversal Arrays int inorder[] = { 4, 2, 5, 1, 3 }; int preorder[] = { 1, 2, 4, 5, 3 }; int postorder[] = { 4, 5, 2, 3, 1 }; int len1 = inorder.length; int len2 = preorder.length; int len3 = postorder.length; // Check if all the array lengths are equal if ((len1 == len2) && (len2 == len3)) { boolean res = checktree(preorder, 0, inorder, 0, postorder, 0, len1); System.out.print(((res) ? "Yes" : "No")); } else System.out.print("No
"); }}// This code is contributed by Arnab Kundu |
Python
# Python program to check if the given# three traversals are of the same# tree or not# Function to check if all three traversals# are of the same treedef checktree(preorder, inorder, postorder, length): # if the array lengths are 0, # then all of them are obviously equal if length == 0: return 1 # if array lengths are 1, # then check if all of them are equal if length == 1: return (preorder[0] == inorder[0]) and (inorder[0] == postorder[0]) # search for first element of preorder # in inorder array idx = -1 for i in range(length): if inorder[i] == preorder[0]: idx = i break if idx == -1: return 0 # check for the left subtree ret1 = checktree(preorder[1:], inorder, postorder, idx) # check for the right subtree ret2 = checktree(preorder[idx + 1:], inorder[idx + 1:], postorder[idx:], length-idx-1) # return 1 only if both of them are correct else 0 return (ret1 and ret2)# Driver Codeif __name__ == "__main__": inorder = [4, 2, 5, 1, 3] preorder = [1, 2, 4, 5, 3] postorder = [4, 5, 2, 3, 1] len1 = len(inorder) len2 = len(preorder) len3 = len(postorder) # check if all the array lengths are equal if (len1 == len2) and (len2 == len3): correct = checktree(preorder, inorder, postorder, len1) if (correct): print("Yes") else: print("No") else: print("No") |
C#
// C# program to check if the given// three traversals are of the same// tree or notusing System;class GFG { // Function to check if traversals are // of the same tree static bool checktree(int[] preorder, int s, int[] inorder, int s1, int[] postorder, int s2, int len) { // if the array lengths are 0, // then all of them are obviously equal if (len == 0) return true; // if array lengths are 1, // then check if all of them are equal if (len == 1) return ((preorder[s] == inorder[s1]) && (inorder[s1] == postorder[s2])); // search for first element of preorder // in inorder array int idx = -1; for (int i = s1; i < len; ++i) if (inorder[i] == preorder[s]) { idx = i; break; } if (idx == -1) return false; // check for the left subtree bool ret1 = checktree(preorder, s + 1, inorder, s1, postorder, s2, idx); // check for the right subtree bool ret2 = checktree( preorder, s + idx + 1, inorder, s1 + idx + 1, postorder, s2 + idx, len - idx - 1); // return 1 only if both of them are // correct else 0 return (ret1 && ret2); } // Driver Code static public void Main() { // Traversal Arrays int[] inorder = { 4, 2, 5, 1, 3 }; int[] preorder = { 1, 2, 4, 5, 3 }; int[] postorder = { 4, 5, 2, 3, 1 }; int len1 = inorder.Length; int len2 = preorder.Length; int len3 = postorder.Length; // Check if all the array lengths are equal if ((len1 == len2) && (len2 == len3)) { bool res = checktree(preorder, 0, inorder, 0, postorder, 0, len1); Console.Write(((res) ? "Yes" : "No")); } else Console.Write("No
"); }}// This code is contributed by ajit |
PHP
<?php// PHP program to check if the given// three traversals are of the same// tree or not// Function to check if traversals are// of the same treefunction checktree($preorder, $inorder, $postorder, $len){ // if the array lengths are 0, // then all of them are obviously equal if ($len == 0) return 1; // if array lengths are 1, // then check if all of them are equal if ($len == 1) return ($preorder[0] == $inorder[0]) && ($inorder[0] == $postorder[0]); // search for first element of preorder // in inorder array $idx = -1; for ($i = 0; $i < $len; ++$i) if ($inorder[$i] == $preorder[0]) { $idx = $i; break; } if ($idx == -1) return 0; // check for the left subtree $ret1 = checktree(array_slice($preorder,1), $inorder, $postorder, $idx); // check for the right subtree $ret2 = checktree(array_slice($preorder,$idx + 1), array_slice
|