for (int i=0; i<SizeofDataGrid;i++)//save datatable into array
{
for (int j=0; j<4;j++)
{
FILTERED[i,j]=Convert.ToString(interaction.Rows[i][j]);
}
}
for (int i = 0; i < FILTERED.GetLength(0); i++)
{
string UNIQUEID = UniqueUserId[i];
for (int j = 0; j < SizeofDataGrid; j++)
{
if (UNIQUEID == FILTERED[j,0])// match ID
{
for (int x = 0; x < SizeofDataGrid; x++)
{
if (startpoint == FILTERED[j, 1]) //Match start Lesson
{
TotalTime[1, i] = TotalTime[1, i] + Convert.ToUInt16(FILTERED[j, 2]);
TotalTime[0, i] = i;
TotalScore[1, i] = TotalScore[1, i] + Convert.ToUInt16(FILTERED[j, 3]);
TotalScore[0, i] = i;
}
}
}
}
}
我相信我是在正确的轨道上,将最后的postorder值作为根,在Inorder列表中找到该值并将树分割到该值的左侧和右侧。根据我一直在尝试的内容,我能够得出这样的结果:它没有正确格式化,所以我将其截屏。
答案 0 :(得分:1)
获取Postorder中的最后一个元素,这是你的根元素,然后在Inorder中找到该元素,并在左右列表中拆分元素,给你LEFT:&#34; 3 2 1 5 4 6&#34;和右:&#34; 9 7 11 10&#34;然后走一下Postorder列表并在找到Inorder列表中根元素索引之前的第一个数字后将其拆分,在这种情况下,这是&#34; 6&#34;所以走到6,这将给你&#34; 1 2 3 4 5 6&#34;其余的是&#34; 9 11 10 7&#34;。然后以相反的顺序插入这些列表,例如:&#34; 6 5 4 3 2 1&#34;之后&#34; 7 10 11 9&#34;这应该给你正确的树顺序。
答案 1 :(得分:0)
这有点棘手,也许是因为大脑半球有点矛盾; - )
感兴趣的参数是:
post
:包含后序遍历的数组lp
:左post
数组索引rp
:post
数组的正确索引in
:包含inorder遍历的数组li
:左in
数组索引ri
:ìn
数组程序是&#34;自然&#34;递归。在每次递归时,根始终为post[rp]
。这是最后访问过的节点(后序)。
因此,首先要做的是知道数组in
中根的索引。为了计算,我们从li
扫描到ri
,我们搜索post[rp]
。让i
数组in
中的根索引。 我认为树没有重复的密钥。
鉴于root的索引,那么
i - li
是左子树中的节点数ri - i
是右子树中的节点数现在,in
变为自然分区。左子树位于[li, i - 1]
之间,右子树位于[i + 1, ri]
之间。
我认为有点混淆是确定post
中的子树在哪里。左子树位于[lp, lp + (i - li) - 1]
之间,右侧位于[rp - (ri - i), rp - 1]
之间。考虑上面表达的每个子树的节点数(在枚举列表中)。
有了这些知识,我们就可以设计算法了(我用伪C ++编写,但我认为很容易翻译成java):
Node * build_postorder(const vector<int> & post, long lp, long rp,
const vector<int> & in, long li, long ri)
{
if (lp > rp)
return nullptr; // we stop recursion when the tree is empty
Node * root = new Node(post[rp]); // Creates the root with key value post[rp]
int i = li;
for (; i <= ri; ++i) // search in inorder array the index of root
if (in[i] == post[rp])
break; // this line must always to execute it (if everything is oK)
LLINK(root) = build_postorder(post, lp, lp + (i - li) - 1, in, li, i - 1);
RLINK(root) = build_postorder(post, rp - (ri - i), rp - 1, in, i + 1, ri);
return root;
}
祝你好运!