我遇到了一个真正让我感兴趣的问题,但我不确定我是否完全理解如何完成手头的任务:设计一个算法,用两个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;
}
答案 0 :(得分:0)
AFAIK对于给定序列,二进制树是不可能的,
1)两个序列的长度不同 - 我们可以检查数组长度
2)在顺序序列中搜索后序值失败 - 搜索功能应该被修改为在搜索失败时返回负值而不是返回i(在for循环之后)
3)给定的序列不代表后序和同一树的顺序 - 正如Gene所建议的那样遍历树并检查序列
答案 1 :(得分:0)
此问题的代码:)
int searchelement( vector<int> &v , int start ,int end,int val)
{
for(int i=start;i<=end;i++)
{
if(v[i]==val)
return i;
}
return -1;
}
TreeNode * abc(vector<int> &postorder, vector<int> &inorder , int start ,int end , int &index)
{
if(start>end)
return NULL;
int i = searchelement(inorder,start,end,postorder[index--]);
TreeNode * temp = new TreeNode(inorder[i]);
if(start==end)
{
return temp;
}
temp->right=abc(postorder,inorder,i+1,end,index);
temp->left =abc(postorder,inorder,start,i-1,index);
return temp;
}
main(){
TreeNode * head =NULL;
int start=0,end=inorder.size()-1,index=0;
head= abc(preorder,inorder,start,end,index);
}