【发布时间】:2014-12-30 18:46:12
【问题描述】:
我遇到了一个真正让我感兴趣的问题,但我不确定我是否完全理解如何完成手头的任务:设计一个算法来从两个 n 长序列构造一棵二叉树,已知是同一二叉树的中序和后序遍历。
到目前为止,我已经完成了这么多。到目前为止,下面是我的(相关)代码,但是我也希望能够识别不存在二叉树的序列。我不知道如何检查这个。有人可以在正确的方向上推动我吗?
node* build_tree(int in[], int inStart, int inEnd,
int post[], int postStart, int postEnd) {
if(inStart > inEnd || postStart > postEnd)
return NULL;
int rootValue = post[postEnd];
node *tNode = new_node(rootValue);
// find the index of this node in in-order traversal
int inIndex = search(in, inStart, inEnd, rootValue);
// Using index in in-order traversal, construct left and right subtrees
tNode->left = build_tree(in, inStart, inIndex-1, post, postStart, postStart+inIndex-(inStart+1));
tNode->right = build_tree(in, inIndex+1, inEnd, post, postStart + inIndex - inStart, postEnd - 1);
return tNode;
}
// Function to find index of value in arr[start...end]
// The function assumes that value is present in in[]
int search(int arr[], int start, int end, int value) {
int i;
for(i = start; i < end; i++) {
if(arr[i] == value)
return i;
}
return i;
}
// function that allocates a new node with the
// given data and NULL left and right pointers
node* new_node(int data) {
node* n = (node*)malloc(sizeof(node));
n->data = data;
n->left = NULL;
n->right = NULL;
return n;
}
【问题讨论】:
-
您对问题的描述很好。因此,请尝试一下算法,以便我们批评您的方法。如果您不这样做,您将被否决和/或关闭。
-
到目前为止,我添加了我的代码,我认为它已经接近了。我只是不确定如何验证输出并证明它正在工作。
-
只需遍历您要生成的中序和后序树并将它们与输入进行比较!
-
您可以在 SO 中搜索相同问题的解决方案,然后对照它们检查您的解决方案。不过,它们中的大多数都处理树中元素唯一的输入。
-
我将如何确定给定序列是否可以生成二叉树?到目前为止,我已经完成了它,但那部分仍然没有运气......
标签: c algorithm binary-tree