find depth of binary search tree
May 2, 2013 3 Comments
We can find the depth of the binary search tree in three different recursive ways
– using instance variables to record current depth and total depth at every level
– without using instance variables in top-bottom approach
– without using instance variables in bottom-up approach
Full source code can be downloaded here
Approach #1: using instance variables to record current depth and total depth at every level
int currentDepth, depth; public int depth(BinaryNode n) { if (n != null) { currentDepth++; // record total depth if current depth is greater than total depth if (currentDepth > depth) { depth = currentDepth; } // recursively traverse entire tree depth(n.left); depth(n.right); // decrement as we traverse up the binary tree currentDepth--; } return depth; }
Pros: Easier to implement and understand
Cons: Usage of instance variables. Ideally any recursive call should not make use of instance variables and by doing so it moves close towards linear programming.
Approach #2: without using instance variables in top-bottom approach
public int depth3(BinaryNode node, int d){ int leftDepth = d, rightDepth = d; if(node.left != null){ leftDepth = depth3(node.left, d+1); } if(node.right != null){ rightDepth = depth3(node.right, d+1); } return leftDepth > rightDepth ? leftDepth : rightDepth; }
Approach #3: without using instance variables in bottom-up approach
public int depth2(BinaryNode node){ if(node == null) return 0; int left = depth2(node.left); int right = depth2(node.right); int x = left > right ? left+1 : right+1; return x; }
Approach #2 and #3 are actually recursive way of finding the depth. In #2 we only depend on the return type of the method because back-tracking helps us to keep track of the tree depth. In #3, since we are incrementing the depth in top-bottom fashion, we need additional parameter to the method to track the depth.
My 2 cents for best approach is #2.
Full source code can be downloaded here
Output:
Maximum depth of the Binary Tree is using instance variables: 3 Maximum depth of the Binary Tree is without using instance variables in bottom-up approach: 3 Maximum depth of the Binary Tree is without using instance variables in top-bottom approach: 3 | |-------28 |-------25 | |-------22 20 | |-------18 |-------15 | |-------12
One question: in the piece of code “using instance variables to record current depth and total depth at every level”, shouldn’t be the decrementation just before the call to depth(n.right)?
depth(n.left);
currentDepth–;
depth(n.right);
no, its after the left and right recursive calls. It indicates that there are no more nodes down and hence we need to go one level up
determineDepth( TreeNode *ptr, int *totPtr, int *currPtr ) const