├── LICENSE ├── README.md ├── checkifbalanced.cpp ├── diagonaltraversal.cpp ├── heightoftree.cpp ├── inorder.cpp ├── levelorderbfs.cpp ├── postorder.cpp ├── preorder.cpp ├── reverselevelorder.cpp ├── treeintro.cpp ├── verticalevlordertraversal.cpp ├── zigzag2.cpp └── zigzagtraversal.cpp /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Riti Kumari 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Binary Trees 2 | 3 | 4 | - GitHub Repo : https://github.com/riti2409/trees-dsa 5 | 6 | - Binary Trees : 7 | - https://www.youtube.com/playlist?list=PLgUwDviBIf0q8Hkd7bK2Bpryj2xVJk8Vk (Take U Forward)
8 | - https://www.youtube.com/playlist?list=PLNxqWc8Uj2LRbsOlBiPJZAyZpaUwdDepd (Kashish Mehndiratta)
9 | 10 | 11 | - PDF(of notes): https://drive.google.com/file/d/13AcZJW7oUI8bw_04Ims1Os7x5ASYLztK/view?usp=sharing 12 | 13 | Would love if you could add more resources :) 14 | 15 | -------------------------------------------------------------------------------- /checkifbalanced.cpp: -------------------------------------------------------------------------------- 1 | int solve(Node*root, int &f){ 2 | if(!root) return 0; 3 | int l=solve(root->left,f); 4 | int r=solve(root->right,f); 5 | if(abs(l-r)>1) 6 | f=0; 7 | return (1+max(l,r)); 8 | } 9 | //Function to check whether a binary tree is balanced or not. 10 | bool isBalanced(Node *root) 11 | { 12 | int f=1; 13 | solve(root,f); 14 | return f; 15 | } 16 | -------------------------------------------------------------------------------- /diagonaltraversal.cpp: -------------------------------------------------------------------------------- 1 | vector diagonal(Node *root) 2 | { 3 | vectorans; 4 | queueq; 5 | if(!root) return ans; 6 | 7 | q.push(root); 8 | while(!q.empty()){ 9 | Node*temp=q.front(); 10 | q.pop(); 11 | while(temp){ 12 | if(temp->left) q.push(temp->left); 13 | ans.push_back(temp->data); 14 | temp=temp->right; 15 | } 16 | 17 | } 18 | return ans; 19 | 20 | 21 | } -------------------------------------------------------------------------------- /heightoftree.cpp: -------------------------------------------------------------------------------- 1 | class Solution{ 2 | public: 3 | //Function to find the height of a binary tree. 4 | int height(struct Node* node){ 5 | if(!node) 6 | return 0; 7 | return(1+max(height(node->left),height(node->right))); 8 | } 9 | }; -------------------------------------------------------------------------------- /inorder.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct treenode{ 4 | int val; 5 | struct treenode *left; 6 | struct treenode *right; 7 | 8 | treenode(int data){ 9 | val=data; 10 | left=right=NULL; 11 | 12 | } 13 | }; 14 | 15 | void innorder(treenode*root){ 16 | if(!root) return; 17 | vectorv; 18 | 19 | innorder(root->left); 20 | cout<val<<" "; 21 | innorder(root->right); 22 | 23 | } 24 | 25 | 26 | int main(){ 27 | treenode * root=new treenode(12); 28 | root->left=new treenode(20); 29 | root->right=new treenode(10); 30 | root->left->left=new treenode(11); 31 | root->left->right=new treenode(17); 32 | root->right->left=new treenode(15); 33 | root->right->right=new treenode(18); 34 | 35 | cout<<" inorder :"; 36 | innorder(root); 37 | 38 | return 0; 39 | } -------------------------------------------------------------------------------- /levelorderbfs.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct treenode 4 | { 5 | int val; 6 | struct treenode *left; 7 | struct treenode *right; 8 | 9 | treenode(int data) 10 | { 11 | val = data; 12 | left = right = NULL; 13 | } 14 | }; 15 | void levelorder(treenode *root) 16 | { 17 | vector vec; 18 | if (!root) 19 | return; 20 | 21 | queue q; 22 | q.push(root); 23 | while (!q.empty()) 24 | { 25 | treenode *temp = q.front(); 26 | vec.push_back(temp->val); 27 | if (temp->left) 28 | q.push(temp->left); 29 | if (temp->right) 30 | q.push(temp->right); 31 | q.pop(); 32 | } 33 | for (auto x : vec) 34 | { 35 | cout << x << "->"; 36 | } 37 | } 38 | 39 | int main() 40 | { 41 | treenode *root = new treenode(12); 42 | root->left = new treenode(20); 43 | root->right = new treenode(10); 44 | root->left->left = new treenode(11); 45 | root->left->right = new treenode(17); 46 | root->right->left = new treenode(15); 47 | root->right->right = new treenode(18); 48 | cout << "level order:"; 49 | levelorder(root); 50 | 51 | return 0; 52 | } -------------------------------------------------------------------------------- /postorder.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct treenode{ 4 | int val; 5 | struct treenode *left; 6 | struct treenode *right; 7 | 8 | treenode(int data){ 9 | val=data; 10 | left=right=NULL; 11 | 12 | } 13 | }; 14 | 15 | void postorder(treenode*root){ 16 | if(!root) return; 17 | vectorv; 18 | 19 | postorder(root->left); 20 | postorder(root->right); 21 | cout<val<<" "; 22 | } 23 | 24 | int main(){ 25 | treenode * root=new treenode(12); 26 | root->left=new treenode(20); 27 | root->right=new treenode(10); 28 | root->left->left=new treenode(11); 29 | root->left->right=new treenode(17); 30 | root->right->left=new treenode(15); 31 | root->right->right=new treenode(18); 32 | 33 | cout<<"postorder :"; 34 | postorder(root); 35 | return 0; 36 | } -------------------------------------------------------------------------------- /preorder.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct treenode{ 4 | int val; 5 | struct treenode *left; 6 | struct treenode *right; 7 | 8 | treenode(int data){ 9 | val=data; 10 | left=right=NULL; 11 | 12 | } 13 | }; 14 | void preorder(treenode*root){ 15 | if(!root) return; 16 | vectorv; 17 | cout<val<<" "; 18 | preorder(root->left); 19 | preorder(root->right); 20 | 21 | } 22 | 23 | 24 | int main(){ 25 | treenode * root=new treenode(12); 26 | root->left=new treenode(20); 27 | root->right=new treenode(10); 28 | root->left->left=new treenode(11); 29 | root->left->right=new treenode(17); 30 | root->right->left=new treenode(15); 31 | root->right->right=new treenode(18); 32 | cout<<"preorder:"; 33 | preorder(root); 34 | 35 | return 0; 36 | } -------------------------------------------------------------------------------- /reverselevelorder.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct treenode 4 | { 5 | int val; 6 | struct treenode *left; 7 | struct treenode *right; 8 | 9 | treenode(int data) 10 | { 11 | val = data; 12 | left = right = NULL; 13 | } 14 | }; 15 | void reverselevelorder(treenode * root){ 16 | vector vec; 17 | if (!root) 18 | return; 19 | 20 | queue q; 21 | q.push(root); 22 | while (!q.empty()) 23 | { 24 | treenode *temp = q.front(); 25 | vec.push_back(temp->val); 26 | if (temp->left) 27 | q.push(temp->left); 28 | if (temp->right) 29 | q.push(temp->right); 30 | q.pop(); 31 | } 32 | reverse(vec.begin(),vec.end()); 33 | for(auto &x : vec) 34 | { 35 | cout << x << "->"; 36 | } 37 | } 38 | 39 | int main() 40 | { 41 | treenode *root = new treenode(1); 42 | root->left = new treenode(2); 43 | root->right = new treenode(3); 44 | root->left->left = new treenode(4); 45 | root->left->right = new treenode(5); 46 | root->right->left = new treenode(6); 47 | root->right->right = new treenode(7); 48 | cout << "reverselevel order:"; 49 | reverselevelorder(root); 50 | 51 | return 0; 52 | } 53 | -------------------------------------------------------------------------------- /treeintro.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | using namespace std; 3 | struct treenode{ 4 | int val; 5 | struct treenode *left; 6 | struct treenode *right; 7 | 8 | treenode(int data){ 9 | val=data; 10 | left=right=NULL; 11 | 12 | } 13 | }; 14 | void preorder(treenode*root){ 15 | if(!root) return; 16 | vectorv; 17 | cout<val<<" "; 18 | preorder(root->left); 19 | preorder(root->right); 20 | 21 | } 22 | void innorder(treenode*root){ 23 | if(!root) return; 24 | vectorv; 25 | 26 | innorder(root->left); 27 | cout<val<<" "; 28 | innorder(root->right); 29 | 30 | } 31 | void postorder(treenode*root){ 32 | if(!root) return; 33 | vectorv; 34 | 35 | postorder(root->left); 36 | postorder(root->right); 37 | cout<val<<" "; 38 | } 39 | 40 | int main(){ 41 | treenode * root=new treenode(12); 42 | root->left=new treenode(20); 43 | root->right=new treenode(10); 44 | root->left->left=new treenode(11); 45 | root->left->right=new treenode(17); 46 | root->right->left=new treenode(15); 47 | root->right->right=new treenode(18); 48 | cout<<"preorder:"; 49 | preorder(root); 50 | cout<<" inorder :"; 51 | innorder(root); 52 | cout<<"postorder :"; 53 | postorder(root); 54 | return 0; 55 | } -------------------------------------------------------------------------------- /verticalevlordertraversal.cpp: -------------------------------------------------------------------------------- 1 | void getverticalorder(Node*root,int hd,map>&m){ 2 | if(!root) return; 3 | 4 | m[hd].push_back(root->data); 5 | if(root->left) getverticalorder(root->left,hd-1,m); 6 | if(root->right) getverticalorder(root->right,hd+1,m); 7 | 8 | } 9 | vector verticalOrder(Node *root) 10 | { 11 | map> m; 12 | int hd=0; 13 | vectorvec; 14 | getverticalorder(root,hd,m); 15 | for(auto x:m){ 16 | for(auto y:x.second){ 17 | vec.push_back(y); 18 | } 19 | 20 | } 21 | return vec; 22 | } -------------------------------------------------------------------------------- /zigzag2.cpp: -------------------------------------------------------------------------------- 1 | vector zigZagTraversal(Node* root) 2 | { 3 | vectorans; 4 | if(!root){ 5 | return ans; 6 | } 7 | queueq; 8 | q.push(root); 9 | int level=1; 10 | while(!q.empty()){ 11 | int sz=q.size(); 12 | 13 | vectort; 14 | while(sz--){ 15 | Node*temp=q.front(); 16 | t.push_back(temp->data); 17 | if(temp->left) q.push(temp->left); 18 | if(temp->right) q.push(temp->right); 19 | q.pop(); 20 | } 21 | if(level%2==0) 22 | reverse(t.begin(),t.end()); 23 | for(int i=0;i 2 | using namespace std; 3 | struct treenode 4 | { 5 | int data; 6 | struct treenode *left; 7 | struct treenode *right; 8 | 9 | treenode(int data) 10 | { 11 | this->data = data; 12 | left = right = NULL; 13 | } 14 | }; 15 | void zigzagtraversal(treenode * root){ 16 | vector vec; 17 | vector>sol; 18 | if (!root) 19 | return; 20 | 21 | stackst1; 22 | stackst2; 23 | 24 | st1.push(root); 25 | while(!st1.empty() || !st2.empty()){ 26 | while(!st1.empty()){ 27 | treenode*temp=st1.top(); 28 | vec.push_back(temp->data); 29 | if(root->left) st2.push(root->left); 30 | if(root->right) st2.push(root->right); 31 | st1.pop(); 32 | } 33 | if(vec.size()!=0){ 34 | sol.push_back(vec); 35 | vec.clear(); 36 | 37 | } 38 | while(!st2.empty()){ 39 | treenode*temp=st2.top(); 40 | vec.push_back(temp->data); 41 | if(root->left) st1.push(root->left); 42 | if(root->right) st1.push(root->right); 43 | st2.pop(); 44 | } 45 | if(vec.size()!=0){ 46 | sol.push_back(vec); 47 | vec.clear(); 48 | 49 | } 50 | } 51 | 52 | for (int i = 0; i < sol.size(); i++) 53 | { 54 | for (int j = 0; j < sol[i].size(); j++) 55 | { 56 | cout << sol[i][j] << " "; 57 | } 58 | 59 | } 60 | } 61 | 62 | int main() 63 | { 64 | treenode *root = new treenode(1); 65 | root->left = new treenode(2); 66 | root->right = new treenode(3); 67 | root->left->left = new treenode(4); 68 | root->left->right = new treenode(5); 69 | root->right->left = new treenode(6); 70 | root->right->right = new treenode(7); 71 | cout << "zigzag:"; 72 | zigzagtraversal(root); 73 | 74 | return 0; 75 | } 76 | --------------------------------------------------------------------------------