Let me rewrite the code in a little simpler way for the sake of an easy and better explanation.
function maxDepth(node) {
if (node == null)
return 0;
else {
l = maxDepth(node.left)
r = maxDepth(node.right)
return Math.max(left, right) + 1;
}
}
Now, let's explain the above recursion with the following tree:
A
/ \
B C
/
D
The function maxDepth(node)
get called with the root (A
), therefore, we will explain our recursion stack pictorially starting from node A
:
A
| l = ?
|-------> B
| | l = ?
| |-------> D
| | | l = ?
| | |-------> null (return 0)
A
| l = ?
|-------> B
| | l = ?
| |-------> D
| | | l = 0 <---------|
| | |-------> null (return 0)
A
| l = ?
|-------> B
| | l = ?
| |-------> D
| | | l = 0
| | |
| | | r = ?
| | |-------> null (return 0)
A
| l = ?
|-------> B
| | l = ?
| |-------> D
| | | l = 0
| | |
| | | r = 0 <---------|
| | |-------> null (return 0)
A
| l = ?
|-------> B
| | l = ? <--------------------------|
| |-------> D |
| | | l = 0 |
| | | max(0,0)+1 => 1
| | | r = 0
A
| l = ?
|-------> B
| | l = 1 <--------------------------|
| |-------> D |
| | | l = 0 |
| | | max(0,0)+1 => 1
| | | r = 0
A
| l = ?
|-------> B
| | l = 1
| |
| | r = ?
| | -------> null (return 0)
A
| l = ?
|-------> B
| | l = 1
| |
| | r = 0 <---------|
| | -------> null (return 0)
A
| l = ? <--------------------------|
|-------> B |
| | l = 1 |
| | max(1,0)+1 => 2
| | r = 0
A
| l = 2 <--------------------------|
|-------> B |
| | l = 1 |
| | max(1,0)+1 => 2
| | r = 0
A
| l = 2
|
| r = ?
| -------> C
| | l = ? <---------|
| |-------> null (return 0)
A
| l = 2
|
| r = ?
| -------> C
| | l = 0
| |
| | r = ? <---------|
| |-------> null (return 0)
A
| l = 2
|
| r = ? <---------------------------|
| -------> C |
| | l = 0 |
| | max(0,0)+1 => 1
| | r = 0
A
| l = 2
|
| r = 1 <---------------------------|
| -------> C |
| | l = 0 |
| | max(0,0)+1 => 1
| | r = 0
A <----------------------|
| l = 2 |
| max(2,1)+1 => 3
| r = 1
Finally, A
returns 3
.
3
^
|
A (3)<-------------------|
| l = 2 |
| max(2,1)+1 => 3
| r = 1