【发布时间】: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);
}
【问题讨论】:
-
您没有显示将节点添加到列表中的代码,那么我们如何回答您的问题?为什么不把
createLevelLinkedList的完整代码贴出来? -
是的,当然。我正在查看 GitHub 上的一些代码 github.com/gaylemcd/ctci/blob/master/java/Chapter%204/…
标签: java algorithm recursion arraylist tree