Skip to content

Commit 7c1e41a

Browse files
committed
Add feature get_parent_node.
1 parent 5ff28f7 commit 7c1e41a

2 files changed

Lines changed: 69 additions & 0 deletions

File tree

binarytree/__init__.py

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

316316

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

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,
@@ -882,3 +883,20 @@ def test_heap_float_values():
882883
assert root.min_leaf_depth == root_copy.min_leaf_depth
883884
assert root.min_node_value == root_copy.min_node_value + 0.1
884885
assert root.size == root_copy.size
886+
887+
888+
@pytest.mark.order14
889+
def test_get_parent_node():
890+
root = Node(0)
891+
root.left = Node(1)
892+
root.right = Node(2)
893+
root.left.left = Node(3)
894+
root.right.right = Node(4)
895+
assert get_parent_node(root, root.left.left) == root.left
896+
assert get_parent_node(root, root.left) == root
897+
assert get_parent_node(root, root) is None
898+
assert get_parent_node(root, root.right.right) == root.right
899+
assert get_parent_node(root, root.right) == root
900+
assert get_parent_node(root, Node(5)) is None
901+
assert get_parent_node(None, root.left) is None
902+
assert get_parent_node(root, None) is None

0 commit comments

Comments
 (0)