【问题标题】:Construct Binary Tree from in-order and post-order Traversals从有序和后序遍历构造二叉树
【发布时间】: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


【解决方案1】:

我的代码解决这个问题:)

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

【讨论】:

  • 感谢您的回答。您能否提供更多关于您的代码如何工作的信息,也许是一些 cmets?
  • @JAL 1) 它只是从后序向量后面挑选元素,然后在中序向量中搜索元素并找到索引。 2) 并根据索引拆分中序向量。
【解决方案2】:

AFAIK 对于给定的序列,二叉树是不可能的,

1) 两个序列的长度不同 -- 我们可以检查数组长度

2) inorder 序列中后序值的查找失败 -- 搜索函数应该修改为在搜索失败时返回负值而不是返回i(在for循环之后)

3) 给定的序列不代表同一棵树的后序和中序 -- 按照 Gene 的建议遍历树并检查序列

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多