Different Type of Veiws in Binary Tree:
Right View:
0th element of each lvl; vector<int> rightSideView(TreeNode* root) {
if(!root) return {};
queue<TreeNode * > q;
q.push(root);
vector<int> ans;
while(!q.empty()){
int s = q.size();
for(int i=0;i<s;i++){
TreeNode * node = q.front();q.pop();
if(node->right) q.push(node->right); // see here that we inserting a right node first;
if(node->left) q.push(node->left);
if(i == 0) ans.push_back(node->val);
}
}
return ans;
}Left View:
left node.Top View:
#include <iostream>
#include <map>
using namespace std;
struct Node
{
int key;
Node *left, *right;
Node(int key){
this->key = key;
this->left = this->right = nullptr;
}
};
void dfs(Node* root, int dist, int level, auto &map){
if (root == nullptr) return;
if (map.find(dist) == map.end() || level < map[dist].second) map[dist] = { root->key, level };
dfs(root->left, dist - 1, level + 1, map);
dfs(root->right, dist + 1, level + 1, map);
}
int main()
{
Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->right = new Node(4);
root->right->left = new Node(5);
root->right->right = new Node(6);
root->right->left->left = new Node(7);
root->right->left->right = new Node(8);
map<int, pair<int, int>> map;
dfs(root,0,0,map);
for (auto it: map) cout << it.second.first << " ";
return 0;
}Bottom View:
void dfs(Node* root, int dist, int level, auto &map){
if (root == nullptr) return;
if (map.find(dist) == map.end() || level >= map[dist].second) map[dist] = { root->key, level }; // only change is level condition reverses.
dfs(root->left, dist - 1, level + 1, map);
dfs(root->right, dist + 1, level + 1, map);
}