Given A binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered From top to bottom.
For example:
Given The following binary tree,
1 <---
/ \
2 3 <---
\ \
5 4 <---
You should return [1, 3, 4].
The following is not a good idea, but also consider the portion of the left subtree that is longer than the right sub-tree
/** Definition for a binary tree node. * struct TreeNode {* int val; * TreeNode *left; * TreeNode *right; * TreeNode (int x): Val (x), left (null), right (NULL) {} *}; */classSolution { Public: Vector<int> Rightsideview (treenode*root) {Vector<int>ret; TreeNode* current =Root; while(current) {Ret.push_back ( current-val); if(current->right) Current = Current->Right ; ElseCurrent = Current->Left ; } returnret; }};
Result:wrong Answer
Input: [1,2,3,4]
Output: [1,3]
Expected: [1,3,4]
So, you have to use stack to record the subtree on the left.
/** Definition for a binary tree node. * struct TreeNode {* int val; * TreeNode *left; * TreeNode *right; * TreeNode (int x): Val (x), left (null), right (NULL) {} *}; */classSolution { Public: Vector<int> Rightsideview (treenode*root) {Vector<int>ret; TreeNode* current =Root; intdepth =0;//depth so far intDepthgap; Stack<TreeNode*>Nodestack; Stack<int>Depthstack; while(current) {Ret.push_back ( current-val); Depth++; if(current->Right ) { if(current->Left ) {Nodestack.push ( current-Left ); Depthstack.push (depth); } Current= current->Right ; } Else{ Current= current->Left ; } } while(!Nodestack.empty ()) { Current=Nodestack.top (); Nodestack.pop (); Depthgap= Depth-Depthstack.top (); Depthstack.pop (); while(depthgap) {Depthgap--; if(current->Right ) { if(current->Left ) {Nodestack.push ( current-Left ); Depthstack.push (Depth-depthgap); } Current= current->Right ; } Else{ Current= current->Left ; } if(!current) Break; } if(!current)Continue; while(current) {Ret.push_back ( current-val); Depth++; if(current->Right ) { if(current->Left ) {Nodestack.push ( current-Left ); Depthstack.push (depth); } Current= current->Right ; } Else{ Current= current->Left ; } } } returnret; }};
199. Binary Tree Right Side View (Tree, Stack)