从有序和后序遍历构造二叉树

时间:2014-11-04 00:15:12

标签: c algorithm binary-tree

我遇到了一个真正让我感兴趣的问题,但我不确定我是否完全理解如何完成手头的任务:设计一个算法,用两个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;
}

2 个答案:

答案 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);
}