-
-
Notifications
You must be signed in to change notification settings - Fork 46.7k
[Binary Tree] Different views of binary tree added #6965
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 20 commits
44b79f4
70f582d
4b443a8
7f421cd
b1c0cf2
9b20d14
cff7de0
5fff376
51d1918
d815e9e
dfeb531
9f3e60a
70823fd
588c83b
1961c3e
c26e54e
c338298
75b898b
f46ec01
0cad195
04ac3eb
afff3f4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,206 @@ | ||
r""" | ||
Problem: Given root of a binary tree, return the: | ||
1. binary-tree-right-side-view | ||
2. binary-tree-left-side-view | ||
3. binary-tree-top-side-view | ||
4. binary-tree-bottom-side-view | ||
""" | ||
|
||
from __future__ import annotations | ||
|
||
from collections import defaultdict | ||
from dataclasses import dataclass | ||
|
||
|
||
@dataclass | ||
class TreeNode: | ||
val: int | ||
left: TreeNode | None = None | ||
right: TreeNode | None = None | ||
|
||
|
||
def make_tree() -> TreeNode: | ||
""" | ||
>>> make_tree().val | ||
3 | ||
""" | ||
return TreeNode(3, TreeNode(9), TreeNode(20, TreeNode(15), TreeNode(7))) | ||
|
||
|
||
def binary_tree_right_side_view(root: TreeNode) -> list[int]: | ||
r""" | ||
Function returns the right side view of binary tree. | ||
|
||
3 <- 3 | ||
/ \ | ||
9 20 <- 20 | ||
/ \ | ||
15 7 <- 7 | ||
|
||
>>> binary_tree_right_side_view(make_tree()) | ||
[3, 20, 7] | ||
>>> binary_tree_right_side_view(None) | ||
[] | ||
""" | ||
|
||
def depth_first_search(root: TreeNode, depth: int, right_view: list[int]) -> None: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file |
||
""" | ||
A depth first search preorder traversal to append the values at | ||
right side of tree. | ||
""" | ||
if not root: | ||
return | ||
|
||
if depth == len(right_view): | ||
right_view.append(root.val) | ||
|
||
depth_first_search(root.right, depth + 1, right_view) | ||
depth_first_search(root.left, depth + 1, right_view) | ||
|
||
right_view: list = [] | ||
if not root: | ||
return right_view | ||
|
||
depth_first_search(root, 0, right_view) | ||
return right_view | ||
|
||
|
||
def binary_tree_left_side_view(root: TreeNode) -> list[int]: | ||
r""" | ||
Function returns the left side view of binary tree. | ||
|
||
3 -> 3 | ||
/ \ | ||
9 -> 9 20 | ||
/ \ | ||
15 -> 15 7 | ||
|
||
>>> binary_tree_left_side_view(make_tree()) | ||
[3, 9, 15] | ||
>>> binary_tree_left_side_view(None) | ||
[] | ||
""" | ||
|
||
def depth_first_search(root: TreeNode, depth: int, left_view: list[int]) -> None: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file |
||
""" | ||
A depth first search preorder traversal to append the values | ||
at left side of tree. | ||
""" | ||
if not root: | ||
return | ||
|
||
if depth == len(left_view): | ||
left_view.append(root.val) | ||
|
||
depth_first_search(root.left, depth + 1, left_view) | ||
depth_first_search(root.right, depth + 1, left_view) | ||
|
||
left_view: list = [] | ||
if not root: | ||
return left_view | ||
|
||
depth_first_search(root, 0, left_view) | ||
return left_view | ||
|
||
|
||
def binary_tree_top_side_view(root: TreeNode) -> list[int]: | ||
r""" | ||
Function returns the top side view of binary tree. | ||
|
||
9 3 20 7 | ||
⬇ ⬇ ⬇ ⬇ | ||
|
||
3 | ||
/ \ | ||
9 20 | ||
/ \ | ||
15 7 | ||
|
||
>>> binary_tree_top_side_view(make_tree()) | ||
[9, 3, 20, 7] | ||
>>> binary_tree_top_side_view(None) | ||
[] | ||
""" | ||
|
||
def breadth_first_search(root: TreeNode, top_view: list[int]) -> None: | ||
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file |
||
""" | ||
A breadth first search traversal with defaultdict ds to append | ||
the values of tree from top view | ||
""" | ||
queue = [(root, 0)] | ||
lookup = defaultdict(list) | ||
|
||
while queue: | ||
first = queue.pop(0) | ||
node, hd = first | ||
|
||
lookup[hd].append(node.val) | ||
|
||
if node.left: | ||
queue.append((node.left, hd - 1)) | ||
if node.right: | ||
queue.append((node.right, hd + 1)) | ||
|
||
for pair in sorted(lookup.items(), key=lambda each: each[0]): | ||
top_view.append(pair[1][0]) | ||
|
||
top_view: list = [] | ||
if not root: | ||
return top_view | ||
|
||
breadth_first_search(root, top_view) | ||
return top_view | ||
|
||
|
||
def binary_tree_bottom_side_view(root: TreeNode) -> list[int]: | ||
r""" | ||
Function returns the bottom side view of binary tree | ||
|
||
3 | ||
/ \ | ||
9 20 | ||
/ \ | ||
15 7 | ||
↑ ↑ ↑ ↑ | ||
9 15 20 7 | ||
|
||
>>> binary_tree_bottom_side_view(make_tree()) | ||
[9, 15, 20, 7] | ||
>>> binary_tree_bottom_side_view(None) | ||
[] | ||
""" | ||
from collections import defaultdict | ||
|
||
def breadth_first_search(root: TreeNode, bottom_view: list[int]) -> None: | ||
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
cclauss marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @dhruvmanila doctests do not run on functions inside functions so the keeperbot should not expect to find them. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file |
||
""" | ||
A breadth first search traversal with defaultdict ds to append | ||
the values of tree from bottom view | ||
""" | ||
queue = [(root, 0)] | ||
lookup = defaultdict(list) | ||
|
||
while queue: | ||
first = queue.pop(0) | ||
node, hd = first | ||
lookup[hd].append(node.val) | ||
|
||
if node.left: | ||
queue.append((node.left, hd - 1)) | ||
if node.right: | ||
queue.append((node.right, hd + 1)) | ||
|
||
for pair in sorted(lookup.items(), key=lambda each: each[0]): | ||
bottom_view.append(pair[1][-1]) | ||
|
||
bottom_view: list = [] | ||
if not root: | ||
return bottom_view | ||
|
||
breadth_first_search(root, bottom_view) | ||
return bottom_view | ||
|
||
|
||
if __name__ == "__main__": | ||
import doctest | ||
|
||
doctest.testmod() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As there is no test file in this pull request nor any test function or class in the file
data_structures/binary_tree/diff_views_of_binary_tree.py
, please provide doctest for the functiondepth_first_search