从给定的有序和预序遍历构造二叉树

Constructing Binary tree from given inorder and preorder traversals

本文关键字:遍历 二叉树      更新时间:2023-10-16

我正在从给定的有序和预序遍历数组中制作二叉树,我不知道为什么它会给我错误的输出,尽管它对于给定数组中的某些点来说是完美的

#include<iostream>
using namespace std;
class Node
{
    public:
        int i;
        Node* left;
        Node* right;
        bool isThreaded;
        Node(int j);
};
Node::Node(int j):i(j)
{
    left=NULL;
    right=NULL;
}
void inorder(Node* root)
{
    if(root)
    {
        inorder(root->left);
        cout<<root->i<<"  ";
        inorder(root->right);
    }
}
int findkey(int* a, int l, int r, int key)
{
    for(int i=l; i<r; i++)
    {
        if(a[i]==key)
            return i;
    }
    return -1;
}
Node* ConstructfromPreorderInorder(int* pre, int n, int* in, int l, int  r, int& k)
{
    Node* root=NULL;
    if(k<n && l<r)
    {
        int key=findkey(in, l, r, pre[k]); //Finds the index of current preorder element in inorder array

        root=new Node(pre[k++]); //Forms the node
        root->left=ConstructfromPreorderInorder(pre, n, in, 0, key, k); //To find the left subtree we traverse to left of the index of element in inroder array
        root->right=ConstructfromPreorderInorder(pre, n, in, key+1, r, k);
        //Similarly we traverse right to form right subtree
    }
    return root;
}
int main()
{
    int pre[]={1,2,4,5,3,6,7};
    int in[]={4,2,5,1,6,3,7};
    int n=sizeof(pre)/sizeof(*pre); //Function used to find the no. of elements in an array. In this case elements in preorder array. Both are same so can use any
    int i=0;
    Node* root2=ConstructfromPreorderInorder(pre, n, in, 0, n, i);
    inorder(root2);
}

虽然它适用于数组中一半的元素,但它会给出不寻常的结果。我已经添加了打印语句,以便更好地查看。

构造左子树范围应该从1开始,而不是从0开始

root->left=ConstructfromPreorderInorder(pre, n, in, l, key, k);

不是

root->left=ConstructfromPreorderInorder(pre, n, in, 0, key, k);

您的潜在问题的答案,"我如何调试这段代码?":

  • 查找最简单的故障情况
  • 分别测试部分代码,如findkey
  • 在你的脑海中慢慢地看一遍。
  • 在调试器中逐步调试。
  • 添加详细打印语句。

最后一个例子:

Node* ConstructfromPreorderInorder(int* pre, int n, int* in, int l, int  r, 
 int& k)
{
cout << "constructing from " << l << " to " << r << " at " << k << endl;