【发布时间】:2019-11-05 14:04:07
【问题描述】:
下面的代码是这个问题的解决方案:“给定一棵二叉树,设计一个算法来创建每个深度的所有节点的链表(例如,如果你有一棵深度为 D 的树,你将有D链表”。
void createLevelLinkedList(TreeNode root, ArrayList<LinkedList<TreeNode>>lists, int level) {
if(root == null) return; //base case
LinkedList<TreeNode> list = null;
if (lists.size()==level){ //Level not contained in list
list = new LinkedList<TreeNode>();
lists.add(list);
} else{
list = lists.get(level);
}
list.add(root);
createLevelLinkedlist(root.left, lists, level+1);
createLevelLinkedList(root.right, lists, level+1);
}
ArrayList<LinkedList<TreeNode>> createLevelLinkedList(TreeNode root){
ArrayList<LinkedList<TreeNode>> lists = new ArrayList<LinkedList<TreeNode>>();
createLevelLinkedlist(root, lists, 0);
return lists;
}
根据解决方案,此代码的运行时间为 O(N),但使用 O(log N) 递归调用。为什么只有 O(log N) 递归调用?看起来在每个调用中,总是有两个新的递归调用 root.left 和 root.right,所以不应该有 O(N) 递归调用吗?树中的每个节点一个?
“该解决方案使用 O(log N) 递归调用(在平衡树中),每个调用都会向堆栈添加一个新级别”
对不起,我真的很困惑,不胜感激,谢谢!
【问题讨论】:
-
也许您在误解或错误陈述所写的内容。如果树是平衡的,则最大堆栈帧深度可能是 log(N)。
-
@JamesKPolk 我同意你的观点,应该进行 N 次方法调用,尽管树的高度应该是
O(lgN)以实现平衡树。 -
@JamesKPolk 最大堆栈帧深度是什么意思?
-
也许解释不是指这个解决方案,而是另一个解决方案?
标签: java recursion arraylist linked-list binary-tree