Write a function named hasPath
that interacts with a tree of BinaryTreeNode
structures representing an unordered binary tree.
The function accepts three parameters: a pointer to the root of the tree, and two integers start and end, and returns true
if a path can be found in the tree from start down to end.
In other words, both start and end must be element data values that are found in the tree, and end must be below start, in one of start's subtrees; otherwise the function returns false
.
If start and end are the same, you are simply checking whether a single node exists in the tree with that data value.
If the tree is empty, your function should return false
.
For example, suppose a BinaryTreeNode
pointer named tree points to the root of a tree storing the following elements.
The table below shows the results of several various calls to your function:
67
/ \
80 52
/ \ /
16 21 99
/
45
Call |
Result |
Reason |
hasPath(tree, 67, 99) |
true |
path exists 67 -> 52 -> 99 |
hasPath(tree, 80, 45) |
true |
path exists 80 -> 21 -> 45 |
hasPath(tree, 67, 67) |
true |
node exists with data of 67 |
hasPath(tree, 16, 16) |
true |
node exists with data of 16 |
hasPath(tree, 52, 99) |
true |
path exists 52 -> 99 |
hasPath(tree, 99, 67) |
false |
nodes do exist, but in wrong order |
hasPath(tree, 80, 99) |
false |
nodes do exist, but there is no path from 80 to 99 |
hasPath(tree, 67, 100) |
false |
end of 100 doesn't exist in the tree |
hasPath(tree, -1, 45) |
false |
start of -1 doesn't exist in the tree |
hasPath(tree, 42, 64) |
false |
start/end of -1 and 45 both don't exist in the tree |
An empty tree does not contain any paths, so if the tree is empty, your function should return false
.
You should not assume that your tree is a binary search tree (BST); its elements could be stored in any order.
Constraints:
You must implement your function recursively and without using loops.
Your function should not modify the tree's state; the state of the tree should remain constant with respect to your function.
Do not construct any new BinaryTreeNode
objects in solving this problem (though you may create as many BinaryTreeNode*
pointer variables as you like).
Do not use any auxiliary data structures to solve this problem (no array, vector, stack, queue, string, etc).
Assume that you are using the BinaryTreeNode
structure as defined below:
struct BinaryTreeNode {
int data;
BinaryTreeNode* left;
BinaryTreeNode* right;
};