存储路径的空间复杂度是多少。从根到数组中特定叶子的二叉树的节点?
基本上,我正在寻找以下算法的空间复杂性:
public void printPath () {
doPrint(root, new ArrayList<TreeNode>());
}
private void doPrint(TreeNode node, List<TreeNode> path) {
if (node == null) return;
path.add(node);
if (node.left == null && node.right == null) {
System.out.println("Path from root: " + root.item + " to leaf: " + node.item + " - ");
for (TreeNode treeNode : path) {
System.out.print(treeNode.item + " ");
}
System.out.println();
}
doPrint(node.left , path);
doPrint(node.right, path);
path.remove(path.size() - 1);
}
答案 0 :(得分:2)
如果您的树是平衡的,那么它将是O(log n)
。这是因为平衡二叉树在每个后续级别上具有两倍的节点,因此如果将树中节点数量加倍,则只添加一个附加层。
路径只保存当前节点的父节点,因此不会出现最终持有整个树的情况。
如果您的树完全不平衡(即每个节点只有一个子节点或更少),那么您将最终将整个树保持在列表中,因为您必须遍历树中的每个节点才能到达单个叶子。在这种情况下,它将是O(n)
。
答案 1 :(得分:1)
这将是O(n)最坏的情况,因为在这种情况下,您将查看树中的每个节点(n个节点)。
答案 2 :(得分:1)
您正在存储位于从根目录到列表中特定叶子的路径上的所有节点。
如果二叉树是高度平衡的,或者它是完整/完整的二叉树,则最坏情况的时间和空间复杂度为O(log n),其中n是二叉树中的节点数。
如果我们没有关于二叉树类型的任何先验信息,那么最坏情况的时间和空间复杂度是O(n),因为树可以是只存在左子节点的形式或者只有正确的孩子在场。