我是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;
}
答案 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)
之类的某些功能中使用的全局变量n1
和n2
但是这里:
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);
}