【发布时间】:2014-10-05 16:43:24
【问题描述】:
也许这个问题不属于,因为这本身不是一个编程问题,如果是这种情况,我深表歉意。
我刚考了抽象数据结构,有一个问题:
树节点的等级定义如下:如果你是树的根,你的等级是0。否则,你的等级是你父母的等级+1。
设计一种算法,计算二叉树中所有节点的秩和。你的算法的运行时间是多少?
我相信我的回答可以解决这个问题,我的伪代码是这样的:
int sum_of_tree_ranks(tree node x)
{
if x is a leaf return rank(x)
else, return sum_of_tree_ranks(x->left_child)+sum_of_tree_ranks(x->right_child)+rank(x)
}
函数秩在哪里
int rank(tree node x)
{
if x->parent=null return 0
else return 1+rank(x->parent)
}
很简单,一棵树的秩和就是左子树的和+右子树的和+根的秩。
我相信这个算法的运行时间是n^2。我相信是这种情况,因为我们没有得到二叉树是平衡的。可能是树中有n 数字,但也有n 不同的“级别”,例如,树看起来像链表而不是树。所以为了计算叶子的等级,我们可能会上升 n 步。叶子的父亲将是 n-1 步等等......所以这就是n+(n-1)+(n-2)+...+1+0=O(n^2)
我的问题是,这是正确的吗?我的算法能解决问题吗?我对运行时的分析是否正确?最重要的是,有没有更好的解决方案来解决这个问题,而不是在n^2 中运行?
【问题讨论】:
标签: math tree big-o time-complexity abstract-data-type