在二叉树中打印常见元素

时间:2018-09-30 09:06:53

标签: c++ data-structures binary-search-tree

我是C ++的新手,我正在尝试使用c ++实现二进制搜索树数据结构。以下代码用于在给定的两个二进制搜索树中打印公共元素。我的解决方法是创建两个数组二进制搜索树1和二进制搜索树2的元素集合,即arr1 [],arr2 []。在方法 create_Array()中,我按排序顺序存储了两个二进制树的值,所以当我在那打印值时,它会按排序顺序打印,但是当我尝试在方法 printcommon()中打印arr1和arr2的值时 它不会按排序顺序打印,而是按树中的顺序打印。

样本输入为:-

  

6

     

5 6 4 1 2 3

     

8

     

6 9 4 10 2 3 5 9

示例输出为

  

树1 = 1 2 3 4 5 6

     

树2 = 2 3 4 5 6 9 10

     

公共节点= 2 3 4 5 6

实际输出为:

  

树1 = 1 2 3 4 5 6

     

树2 = 2 3 4 5 6 9 10

     

公共节点=

为更清楚起见,我在方法printcommon()中注释的行将arr1 [0]打印为5,但应打印1,但在函数create_Array()中,注释的行按排序顺序完美打印,即。 2,3,4,5,6,2,3,4,5,6,9,10。 因此,如果在create_Array()方法中arr1 [0]的值为1,则如何从arr1 [0] = 1变为5。

    #include <iostream>
    using namespace std;
    struct BstNode
    {
        int data;
        BstNode *left;
        BstNode *right;
    };
    int n1, n2;
    BstNode* getNewNode(int element)
    {
        BstNode* newNode = new BstNode;
        newNode->data = element;
        newNode->left = NULL;
        newNode->right = NULL;
        return newNode;
    }
    BstNode* create_Tree(BstNode* root, int element)
    {
        if (root == NULL)
        {
            root = getNewNode(element);
        }
        else if (element < root->data)
        {
            root->left = create_Tree(root->left, element);
        }
        else if (element > root->data)
        {
            root->right = create_Tree(root->right, element);
        }
        return root;
    }
    void InOrder_Traversal(BstNode * root)
    {
        if (root == NULL) return;
        else
            InOrder_Traversal(root->left);
        cout << root->data << " ";
        InOrder_Traversal(root->right);
    }
    void create_Array(BstNode * root, int arr[], int k)
    {
        if (root == NULL) return;
        create_Array(root->left, arr, k);
        arr[k] = root->data;
        /*cout << arr[k] << endl;*             /*please focus on this line
                                                prints in sorted order*/
        k++;
        create_Array(root->right, arr, k);
    }
    void printCommon(BstNode *root1, BstNode *root2)
    {
        int *arr1 = new int[n1];
        int i = 0;
        create_Array(root1, arr1, i);
        int *arr2 = new int[n2];
        int j = 0;
        create_Array(root2, arr2, j);
        cout << "Common Nodes=";
        /*cout << arr1[0];*/  /* this dosent print in sorted order*/                           
        for (int i = 0; i < n1; i++)
        {
            for (int j = 0; j < n2; j++)
            {
                if (arr1[i] == arr2[j])
                {
                    cout << arr2[j] << " ";
                }
            }
        }
    }
    int main()
    {
        BstNode* root1 = NULL;
        BstNode* root2 = NULL;
        int n1, n2, ele;
        cin >> n1;
        for (int i = 0; i < n1; i++)
        {
            cin >> ele;
            root1 = create_Tree(root1, ele);
        }
        cin >> n2;
        for (int i = 0; i < n2; i++)
        {
            cin >> ele;
            root2 = create_Tree(root2, ele);
        }
        cout << "TREE 1=";
        InOrder_Traversal(root1);
        cout << endl;
        cout << "TREE 2=";
        InOrder_Traversal(root2);
        cout << endl;
        printCommon(root1, root2);
        return 0;
    }

1 个答案:

答案 0 :(得分:2)

不确定这是否涵盖了您的所有问题,但这是一个使您的代码失败的错误。

这里:

$('#profession').select2({
    tags: true,
    createTag: function (params) {
        return {
            id: params.term,
            text: params.term,
            newOption: true
        }
    },
    templateResult: function (data) {
        var $result = $("<span></span>");

        $result.text(data.text);

        if (data.newOption) {
            $result.append(" <em>(new)</em>");
        }

        return $result;
    }
});

您创建要在诸如int n1, n2; <<<<<<<< NOTICE BstNode* getNewNode(int element) 之类的某些功能中使用的全局变量n1n2

但是这里:

printCommon

您使用相同的名称创建局部变量,并将输入输入到 local 变量中。

因此,在调用函数int main() { BstNode* root1 = NULL; BstNode* root2 = NULL; int n1, n2, ele; <<<<<<<<<<<<< NOTICE cin >> n1; 时,它不使用输入值,而是使用值为零的 global 变量。

您可以通过在函数内和printcommon内进行cout << "n1 is " << n1 << endl;(在读取输入之后)来查看。

编辑

以上内容并未解决所有问题。另一个问题是main函数,其中索引(aka create_array)错误,即它没有写入0、1、2、3、4 ...,而是返回到零。覆盖先前的元素。

解决此问题的一种方法是对索引使用指针。像这样:

k

并称呼它

void create_Array(BstNode * root, int arr[], int * k)
{
    if (root == NULL) return;
    create_Array(root->left, arr, k);
    arr[*k] = root->data;
    (*k)++;
    create_Array(root->right, arr, k);
}