diff --git a/binary-tree-right-side-view/sol.go b/binary-tree-right-side-view/sol.go new file mode 100644 index 0000000..8890818 --- /dev/null +++ b/binary-tree-right-side-view/sol.go @@ -0,0 +1,45 @@ +package main + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func rightSideView(root *TreeNode) (out []int) { + if root == nil { + return + } + for stack := []*TreeNode{root}; len(stack) != 0; { + top := stack[len(stack)-1] + if len(stack) > len(out) { + out = append(out, top.Val) + } + if top.Right != nil { + stack = append(stack, top.Right) + } else if top.Left != nil { + stack = append(stack, top.Left) + } else { + stack = stack[:len(stack)-1] + if len(stack) != 0 { + new_top := stack[len(stack)-1] + // Easiest way to DFS by modification of tree. + // There was no requirement to keep it intact ¯\_(ツ)_/¯. + if new_top.Right == top { + new_top.Right = nil + } else { + new_top.Left = nil + } + } + } + } + return +}