Egy fa folytonos fa, ha minden gyökér-levél útvonalon az abszolút különbség két szomszédos kulcs kulcsa között 1. Adunk egy bináris fát, ellenőriznünk kell, hogy a fa folytonos-e vagy sem.
Példák:
karakterlánc tartalmaz
Input : 3 / 2 4 / 1 3 5 Output: 'Yes' // 3->2->1 every two adjacent node's absolute difference is 1 // 3->2->3 every two adjacent node's absolute difference is 1 // 3->4->5 every two adjacent node's absolute difference is 1 Input : 7 / 5 8 / 6 4 10 Output: 'No' // 7->5->6 here absolute difference of 7 and 5 is not 1. // 7->5->4 here absolute difference of 7 and 5 is not 1. // 7->8->10 here absolute difference of 8 and 10 is not 1.
A megoldás a fa bejárását igényli. Fontos ellenőrizni, hogy minden sarok esetet kezeljenek. A sarokesetek tartalmaznak egy üres fa egycsomópontos fát, egy csomópontot csak a bal oldali gyermekkel és egy csomópontot az egyetlen jobb gyermekkel.
A fa bejárásánál rekurzívan ellenőrizzük, hogy a bal és a jobb részfa folyamatos-e. Ellenőrizzük azt is, hogy az aktuális csomópont kulcsának kulcsai és gyermekkulcsai közötti különbség 1-e. Alább látható az ötlet megvalósítása.
Végrehajtás:
C++// C++ program to check if a tree is continuous or not #include using namespace std; /* A binary tree node has data pointer to left child and a pointer to right child */ struct Node { int data; struct Node* left * right; }; /* Helper function that allocates a new node with the given data and NULL left and right pointers. */ struct Node* newNode(int data) { struct Node* node = new Node; node->data = data; node->left = node->right = NULL; return(node); } // Function to check tree is continuous or not bool treeContinuous(struct Node *ptr) { // if next node is empty then return true if (ptr == NULL) return true; // if current node is leaf node then return true // because it is end of root to leaf path if (ptr->left == NULL && ptr->right == NULL) return true; // If left subtree is empty then only check right if (ptr->left == NULL) return (abs(ptr->data - ptr->right->data) == 1) && treeContinuous(ptr->right); // If right subtree is empty then only check left if (ptr->right == NULL) return (abs(ptr->data - ptr->left->data) == 1) && treeContinuous(ptr->left); // If both left and right subtrees are not empty check // everything return abs(ptr->data - ptr->left->data)==1 && abs(ptr->data - ptr->right->data)==1 && treeContinuous(ptr->left) && treeContinuous(ptr->right); } /* Driver program to test mirror() */ int main() { struct Node *root = newNode(3); root->left = newNode(2); root->right = newNode(4); root->left->left = newNode(1); root->left->right = newNode(3); root->right->right = newNode(5); treeContinuous(root)? cout << 'Yes' : cout << 'No'; return 0; }
Java // Java program to check if a tree is continuous or not import java.util.*; class solution { /* A binary tree node has data pointer to left child and a pointer to right child */ static class Node { int data; Node left right; }; /* Helper function that allocates a new node with the given data and null left and right pointers. */ static Node newNode(int data) { Node node = new Node(); node.data = data; node.left = node.right = null; return(node); } // Function to check tree is continuous or not static boolean treeContinuous( Node ptr) { // if next node is empty then return true if (ptr == null) return true; // if current node is leaf node then return true // because it is end of root to leaf path if (ptr.left == null && ptr.right == null) return true; // If left subtree is empty then only check right if (ptr.left == null) return (Math.abs(ptr.data - ptr.right.data) == 1) && treeContinuous(ptr.right); // If right subtree is empty then only check left if (ptr.right == null) return (Math.abs(ptr.data - ptr.left.data) == 1) && treeContinuous(ptr.left); // If both left and right subtrees are not empty check // everything return Math.abs(ptr.data - ptr.left.data)==1 && Math.abs(ptr.data - ptr.right.data)==1 && treeContinuous(ptr.left) && treeContinuous(ptr.right); } /* Driver program to test mirror() */ public static void main(String args[]) { Node root = newNode(3); root.left = newNode(2); root.right = newNode(4); root.left.left = newNode(1); root.left.right = newNode(3); root.right.right = newNode(5); if(treeContinuous(root)) System.out.println( 'Yes') ; else System.out.println( 'No'); } } //contributed by Arnab Kundu
Python #Python Program to check continuous tree or not # A binary tree node has data pointer to left child # an a pointer to right child */ # Helper function that allocates a new node with the # given data and null left and right pointers class newNode(): def __init__(selfkey) : self.left = None self.right = None self.data = key # Function to check tree is continuous or not def treeContinuous(root): # if next node is empty then return true if not root: return True # if current node is leaf node then return true # because it is end of root to leaf path if root.left: if not abs(root.data-root.left.data)==1: return False # If right subtree is empty then only check left if root.right: if not abs(root.data-root.right.data)==1: return False # If both left and right subtrees are not empty check # everything if treeContinuous(root.left) and treeContinuous(root.right): return True # Driver code if __name__ == '__main__': root = newNode(7) root.left = newNode(6) root.right = newNode(8) root.left.left = newNode(5) root.left.right = newNode(7) root.right.right = newNode(7) print(treeContinuous(root))
C# // C# program to check if a tree is continuous or not using System; class solution { /* A binary tree node has data pointer to left child and a pointer to right child */ class Node { public int data; public Node left right; }; /* Helper function that allocates a new node with the given data and null left and right pointers. */ static Node newNode(int data) { Node node = new Node(); node.data = data; node.left = node.right = null; return(node); } // Function to check tree is continuous or not static Boolean treeContinuous( Node ptr) { // if next node is empty then return true if (ptr == null) return true; // if current node is leaf node then return true // because it is end of root to leaf path if (ptr.left == null && ptr.right == null) return true; // If left subtree is empty then only check right if (ptr.left == null) return (Math.Abs(ptr.data - ptr.right.data) == 1) && treeContinuous(ptr.right); // If right subtree is empty then only check left if (ptr.right == null) return (Math.Abs(ptr.data - ptr.left.data) == 1) && treeContinuous(ptr.left); // If both left and right subtrees are not empty check // everything return Math.Abs(ptr.data - ptr.left.data)==1 && Math.Abs(ptr.data - ptr.right.data)==1 && treeContinuous(ptr.left) && treeContinuous(ptr.right); } /* Driver program to test mirror() */ static public void Main(String []args) { Node root = newNode(3); root.left = newNode(2); root.right = newNode(4); root.left.left = newNode(1); root.left.right = newNode(3); root.right.right = newNode(5); if(treeContinuous(root)) Console.WriteLine( 'Yes') ; else Console.WriteLine( 'No'); } } //contributed by Arnab Kundu
JavaScript <script> // JavaScript program to check if a tree is continuous or not /* A binary tree node has data pointer to left child and a pointer to right child */ class Node { constructor() { this.data=0; this.left = null; this.right = null; } }; /* Helper function that allocates a new node with the given data and null left and right pointers. */ function newNode(data) { var node = new Node(); node.data = data; node.left = node.right = null; return(node); } // Function to check tree is continuous or not function treeContinuous( ptr) { // if next node is empty then return true if (ptr == null) return true; // if current node is leaf node then return true // because it is end of root to leaf path if (ptr.left == null && ptr.right == null) return true; // If left subtree is empty then only check right if (ptr.left == null) return (Math.abs(ptr.data - ptr.right.data) == 1) && treeContinuous(ptr.right); // If right subtree is empty then only check left if (ptr.right == null) return (Math.abs(ptr.data - ptr.left.data) == 1) && treeContinuous(ptr.left); // If both left and right subtrees are not empty check // everything return Math.abs(ptr.data - ptr.left.data)==1 && Math.abs(ptr.data - ptr.right.data)==1 && treeContinuous(ptr.left) && treeContinuous(ptr.right); } /* Driver program to test mirror() */ var root = newNode(3); root.left = newNode(2); root.right = newNode(4); root.left.left = newNode(1); root.left.right = newNode(3); root.right.right = newNode(5); if(treeContinuous(root)) document.write( 'Yes') ; else document.write( 'No'); </script>
Kimenet
Yes
Egy másik megközelítés (BFS (Queue) használatával)
youtube videók letöltése vlc
Magyarázat: Egyszerűen végighaladunk minden csomóponton szintenként, és ellenőrizzük, hogy a szülő és a gyermek közötti különbség 1-e, ha minden csomópontra igaz, akkor visszatérünk igaz különben visszatérünk hamis .
Végrehajtás:
C++14// CPP Code to check if the tree is continuous or not #include using namespace std; // Node structure struct node { int val; node* left; node* right; node() : val(0) left(nullptr) right(nullptr) { } node(int x) : val(x) left(nullptr) right(nullptr) { } node(int x node* left node* right) : val(x) left(left) right(right) { } }; // Function to check if the tree is continuous or not bool continuous(struct node* root) { // If root is Null then tree isn't Continuous if (root == NULL) return false; int flag = 1; queue<struct node*> Q; Q.push(root); node* temp; // BFS Traversal while (!Q.empty()) { temp = Q.front(); Q.pop(); // Move to left child if (temp->left) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (abs(temp->left->val - temp->val) == 1) Q.push(temp->left); else { flag = 0; break; } } // Move to right child if (temp->right) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (abs(temp->right->val - temp->val) == 1) Q.push(temp->right); else { flag = 0; break; } } } if (flag) return true; else return false; } // Driver Code int main() { // Constructing the Tree struct node* root = new node(3); root->left = new node(2); root->right = new node(4); root->left->left = new node(1); root->left->right = new node(3); root->right->right = new node(5); // Function Call if (continuous(root)) cout << 'Truen'; else cout << 'Falsen'; return 0; } // This code is contributed by Sanjeev Yadav.
Java // JAVA Code to check if the tree is continuous or not import java.util.*; class GFG { // Node structure static class node { int val; node left; node right; node() { this.val = 0; this.left = null; this.right= null; } node(int x) { this.val = x; this.left = null; this.right= null; } node(int x node left node right) { this.val = x; this.left = left; this.right= right; } }; // Function to check if the tree is continuous or not static boolean continuous(node root) { // If root is Null then tree isn't Continuous if (root == null) return false; int flag = 1; Queue<node> Q = new LinkedList<>(); Q.add(root); node temp; // BFS Traversal while (!Q.isEmpty()) { temp = Q.peek(); Q.remove(); // Move to left child if (temp.left != null) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (Math.abs(temp.left.val - temp.val) == 1) Q.add(temp.left); else { flag = 0; break; } } // Move to right child if (temp.right != null) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (Math.abs(temp.right.val - temp.val) == 1) Q.add(temp.right); else { flag = 0; break; } } } if (flag != 0) return true; else return false; } // Driver Code public static void main(String[] args) { // Constructing the Tree node root = new node(3); root.left = new node(2); root.right = new node(4); root.left.left = new node(1); root.left.right = new node(3); root.right.right = new node(5); // Function Call if (continuous(root)) System.out.print('Truen'); else System.out.print('Falsen'); } } // This code is contributed by Rajput-Ji
Python3 # Python program for the above approach # Node structure class Node: def __init__(self x): self.val = x self.left = None self.right = None # Function to check if the tree is continuous or not def continuous(root): # If root is None then tree isn't Continuous if root is None: return False flag = 1 Q = [] Q.append(root) temp = None # BFS Traversal while len(Q) != 0: temp = Q.pop(0) # Move to left child if temp.left is not None: # if difference between parent and child is # equal to 1 then do continue otherwise make # flag = 0 and break if abs(temp.left.val - temp.val) == 1: Q.append(temp.left) else: flag = 0 break # Move to right child if temp.right is not None: # if difference between parent and child is # equal to 1 then do continue otherwise make # flag = 0 and break if abs(temp.right.val - temp.val) == 1: Q.append(temp.right) else: flag = 0 break if flag != 0: return True else: return False # Driver Code # Constructing the Tree root = Node(3) root.left = Node(2) root.right = Node(4) root.left.left = Node(1) root.left.right = Node(3) root.right.right = Node(5) # Function Call if continuous(root): print('True') else: print('False') # This code is contributed by codebraxnzt
C# // C# Code to check if the tree is continuous or not using System; using System.Collections.Generic; class GFG { // Node structure public class node { public int val; public node left; public node right; public node() { this.val = 0; this.left = null; this.right = null; } public node(int x) { this.val = x; this.left = null; this.right = null; } public node(int x node left node right) { this.val = x; this.left = left; this.right = right; } }; // Function to check if the tree is continuous or not static bool continuous(node root) { // If root is Null then tree isn't Continuous if (root == null) return false; int flag = 1; Queue<node> Q = new Queue<node>(); Q.Enqueue(root); node temp; // BFS Traversal while (Q.Count != 0) { temp = Q.Peek(); Q.Dequeue(); // Move to left child if (temp.left != null) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (Math.Abs(temp.left.val - temp.val) == 1) Q.Enqueue(temp.left); else { flag = 0; break; } } // Move to right child if (temp.right != null) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (Math.Abs(temp.right.val - temp.val) == 1) Q.Enqueue(temp.right); else { flag = 0; break; } } } if (flag != 0) return true; else return false; } // Driver Code public static void Main(String[] args) { // Constructing the Tree node root = new node(3); root.left = new node(2); root.right = new node(4); root.left.left = new node(1); root.left.right = new node(3); root.right.right = new node(5); // Function Call if (continuous(root)) Console.Write('Truen'); else Console.Write('Falsen'); } } // This code is contributed by Rajput-Ji
JavaScript <script> // Javascript Code to check if the tree is continuous or not // Node structure class Node { constructor(x) { this.val = x; this.left = null; this.right= null; } } // Function to check if the tree is continuous or not function continuous(root) { // If root is Null then tree isn't Continuous if (root == null) return false; let flag = 1; let Q = []; Q.push(root); let temp; // BFS Traversal while (Q.length!=0) { temp = Q.shift(); // Move to left child if (temp.left != null) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (Math.abs(temp.left.val - temp.val) == 1) Q.push(temp.left); else { flag = 0; break; } } // Move to right child if (temp.right != null) { // if difference between parent and child is // equal to 1 then do continue otherwise make // flag = 0 and break if (Math.abs(temp.right.val - temp.val) == 1) Q.push(temp.right); else { flag = 0; break; } } } if (flag != 0) return true; else return false; } // Driver Code // Constructing the Tree let root = new Node(3); root.left = new Node(2); root.right = new Node(4); root.left.left = new Node(1); root.left.right = new Node(3); root.right.right = new Node(5); // Function Call if (continuous(root)) document.write('True
'); else document.write('False
'); // This code is contributed by avanitrachhadiya2155 </script>
Kimenet
True
Időbonyolultság: O(n)
Segédtér: O(N) itt N a fa csomópontjainak száma.
Kvíz létrehozása