解释递归在算法中如何工作以确定二叉树的深度?

dev*_*r87 3 javascript algorithm recursion binary-tree

我是JavaScript的数据结构的新手,我正在尝试学习二进制搜索树.我正在关注博客文章,并且能够找到解决BST中最大深度问题的有效解决方案,但我不清楚递归是如何工作的以及每次每次添加+1的方法深度.考虑这个问题的好方法是什么?基本上每次节点值不为空时,1会被添加到最终将被调用堆栈返回的内容中(即在每个级别向后回溯到根目录时)?

 function maxDepth(node) {
  // console.log(node.left);
  if (node) {
    return Math.max(maxDepth(node.left), maxDepth(node.right)) + 1;
  } else {

    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

Nay*_*uki 11

maxDepth(node)读取代码如下:

  1. 如果node不是null:

    1. maxDepthnode左边的孩子身上运行同样的算法.让这个回答x.
    2. maxDepthnode正确的孩子身上运行相同的算法.让这个回答y.
    3. 计算Math.max(x, y) + 1并返回此值作为此函数调用的答案.
  2. 否则nodenull,然后返回0.


这意味着当我们尝试maxDepth(node)在非空节点上进行计算时,我们首先计算maxDepth()两个node子节点,然后让这两个子计算完成.然后我们取这些值的最大值,加1,然后返回结果.

例:

      a
     / \
    b   f
   / \   \
  c   e   g
 /           
d 
Run Code Online (Sandbox Code Playgroud)

调用堆栈:

a => max(b,f)
b => max(c,e)
c => max(d,null)
d => max(null,null)
d <= (0,0)+1 = 1
c <= (1,0)+1 = 2
e => max(null,null)
e <= (0,0)+1 = 1
b <= (2,1)+1 = 3
f => (null,g)
g => (null,null)
g <= (0,0)+1 = 1
f <= (0,1)+1 = 2
a <= (3,2)+1 = 4
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释性编辑 - 谢谢@SamSegers! (2认同)

rak*_*rul 5

为了更容易和更好的解释,让我以更简单的方式重写代码。

function maxDepth(node) {
  if (node == null)
      return 0;
  else {
      l = maxDepth(node.left)
      r = maxDepth(node.right)
      return Math.max(left, right) + 1;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们用以下树来解释上述递归:

      A
     / \
    B   C
   /    
  D      
            
Run Code Online (Sandbox Code Playgroud)

该函数maxDepth(node)使用根 ( A)调用,因此,我们将从节点开始以图形方式解释我们的递归堆栈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 
Run Code Online (Sandbox Code Playgroud)

最后,A返回3

3
^
|
A (3)<-------------------|  
| l = 2                  |  
|          max(2,1)+1 => 3
| r = 1 
Run Code Online (Sandbox Code Playgroud)