【问题标题】:Java Recursion Parameter ValueJava 递归参数值
【发布时间】:2014-12-21 07:02:21
【问题描述】:

从二叉树中,您希望创建一个二维数组列表,其中主数组列表中的每个数组列表都包含单个级别上二叉树的所有节点,适用于所有级别。我了解如何使用 DFS 递归地执行此操作,但我很困惑为什么可以通过传入我想作为递归函数中的参数填充的数组列表来获得正确的答案。

我的递归函数的头部是这样的

createLevelLinkedList(TreeNode current, ArrayList<LinkedList<TreeNode>> lists, int level)

使用基本情况:

if (current == null) return;

当遍历树时,当前节点将被追加到“lists”中其对应的arraylist。在递归函数中有两个递归调用将函数移动到当前的子节点:

createLevelLinkedList(current.left, lists, level + 1);
createLevelLinkedList(current.right, lists, level + 1);

假设有一棵树看起来像这样

          5
     3         8
 2      4          9

深度优先树遍历,第一次返回后,TreeNode“2”是栈顶对象,然后是“3”。当 TreeNode "3" 为当前且函数调用时

    createLevelLinkedList(current.right, lists, level + 1);

要将 TreeNode "4" 推送到堆栈上,如果列表确实包含 TreeNode "2" 以及内存中的实际情况如何?

我引用的代码可以在 Github 上找到:https://github.com/gaylemcd/ctci/blob/master/java/Chapter%204/Question4_4/QuestionDFS.java

public static void createLevelLinkedList(TreeNode root, ArrayList<LinkedList<TreeNode>> lists, int level) 
{
  if (root == null) return;
  LinkedList<TreeNode> list = null;
  if (lists.size() == level) { // Level not contained in list
    list = new LinkedList<TreeNode>();
/* Levels are always traversed in order. So, if this is the first time we've visited level i,
 * we must have seen levels 0 through i - 1. We can therefore safely add the level at the end. */
    lists.add(list);
  } else {
    list = lists.get(level);
  }
  list.add(root);
  createLevelLinkedList(root.left, lists, level + 1);
  createLevelLinkedList(root.right, lists, level + 1);
}

【问题讨论】:

标签: java algorithm recursion arraylist tree


【解决方案1】:

您应该明白只有一个ArrayList 实例传递给createLevelLinkedList 方法。对createLevelLinkedList 的每次递归调用都会收到对ArrayList 相同实例的引用。

因此,一旦将 TreeNode 2 添加到 ArrayList(或者,准确地说,添加到包含在 ArrayList 中的 LinkedLists 之一),它就会在递归的整个执行过程中停留在那里方法。当将其添加到列表中的 createLevelLinkedList 调用返回时,它不会消失。

【讨论】:

  • 我明白了。我认为我的主要困惑来自level 在将TreeNode 2 添加到lists 之后没有改变先前堆栈帧中的值。是因为level是原始类型吗?
  • @ArjunPatel Java 是一种按值传递的语言,因此您将原始变量还是引用变量传递给方法并不重要。在这两种情况下,该方法只能在本地更改变量,这不会影响先前的堆栈帧。 lists 变量也保持不变。改变的是lists 对象的状态(当您向其中添加链表和元素时)。
猜你喜欢
  • 2018-06-12
  • 2015-02-20
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2016-07-22
  • 2012-10-09
  • 2012-04-21
  • 2013-07-22
相关资源
最近更新 更多