Skip to content

Commit 821f433

Browse files
authored
Merge pull request #24 from DechinPhy/master
Add get_parent_node function
2 parents 1d384dd + 7c1e41a commit 821f433

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

binarytree/__init__.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,57 @@ def _get_tree_properties(root):
321321
}
322322

323323

324+
def get_parent_node(root, node):
325+
"""Search from the binary tree and return the parent node for require node.
326+
327+
:param root: Root node of the binary tree.
328+
:rtype: binarytree.Node
329+
:param node: Require node you want to get its parent node.
330+
:rtype: binarytree.Node
331+
:return: The parent node of require node.
332+
:rtype: binarytree.Node
333+
334+
**Example**:
335+
336+
.. doctest::
337+
338+
>>> from binarytree import Node, get_parent_node
339+
>>> root = Node(0)
340+
>>> root.left = Node(1)
341+
>>> root.right = Node(2)
342+
>>> root.left.left = Node(3)
343+
>>> print (root)
344+
>>> 0
345+
/ \
346+
1 2
347+
/
348+
3
349+
>>> print (get_parent_node(root, root.left.left))
350+
>>> 1
351+
/
352+
3
353+
"""
354+
if node is None:
355+
return None
356+
node_stack = []
357+
while True:
358+
if root is not None:
359+
node_stack.append(root)
360+
if root.left is node:
361+
return root
362+
else:
363+
root = root.left
364+
elif len(node_stack) > 0:
365+
root = node_stack.pop()
366+
if root.right is node:
367+
return root
368+
else:
369+
root = root.right
370+
else:
371+
break
372+
return None
373+
374+
324375
class Node(object):
325376
"""Represents a binary tree node.
326377

tests/test_tree.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77

88
from binarytree import Node, build, tree, bst, heap
9+
from binarytree import get_parent_node
910
from binarytree.exceptions import (
1011
NodeValueError,
1112
NodeIndexError,
@@ -884,3 +885,20 @@ def test_heap_float_values():
884885
assert root.min_leaf_depth == root_copy.min_leaf_depth
885886
assert root.min_node_value == root_copy.min_node_value + 0.1
886887
assert root.size == root_copy.size
888+
889+
890+
@pytest.mark.order14
891+
def test_get_parent_node():
892+
root = Node(0)
893+
root.left = Node(1)
894+
root.right = Node(2)
895+
root.left.left = Node(3)
896+
root.right.right = Node(4)
897+
assert get_parent_node(root, root.left.left) == root.left
898+
assert get_parent_node(root, root.left) == root
899+
assert get_parent_node(root, root) is None
900+
assert get_parent_node(root, root.right.right) == root.right
901+
assert get_parent_node(root, root.right) == root
902+
assert get_parent_node(root, Node(5)) is None
903+
assert get_parent_node(None, root.left) is None
904+
assert get_parent_node(root, None) is None

0 commit comments

Comments
 (0)