У меня есть некоторое сомнение между массивом и вектором в следующем двоичном древовидном коде.Массивы Vs Vector во время рекурсии
Ниже приведен код, чтобы найти Print все узлы, которые находятся на расстоянии к от узла листа
void TraceLeaves(node *temp,int k,vector<int> v,vector<int> visited)
{
if(temp->left==NULL&&temp->right==NULL)
{
v.push_back(temp->data);
if(visited[v.size()-k-1]==0)
{
visited[v.size()-k-1]=1;
cout<<v[v.size()-k-1]<<"\n";
}
return;
}
else
{
v.push_back(temp->data);
visited.push_back(0);
}
TraceLeaves(temp->left,k,v,visited);
TraceLeaves(temp->right,k,v,visited);
}
int main()
{
root = createnode(1);
root->left=createnode(2);
root->right=createnode(3);
root->left->left = createnode(4);
root->left->right = createnode(5);
root->right->left = createnode(6);
root->right->right = createnode(7);
vector<int> v;
vector<int> visited;
TraceLeaves(root,1,v,visited);
}
Выход вышеуказанного метода является
2
2
3
3
Когда я заменить векторный визит массив с bool visited []
как
void TraceLeaves(node *temp,int k,vector<int> v,bool visited[])
{
if(temp->left==NULL&&temp->right==NULL)
{
v.push_back(temp->data);
if(visited[v.size()-k-1]==0)
{
visited[v.size()-k-1]=1;
cout<<v[v.size()-k-1]<<"\n";
}
return;
}
else
{
v.push_back(temp->data);
visited[v.size()-1]=0;
}
TraceLeaves(temp->left,k,v,visited);
TraceLeaves(temp->right,k,v,visited);
}
int main()
{
root = createnode(1);
root->left=createnode(2);
root->right=createnode(3);
root->left->left = createnode(4);
root->left->right = createnode(5);
root->right->left = createnode(6);
root->right->right = createnode(7);
vector<int> v;
bool visited[5]={false};
TraceLeaves(root,1,v,visited);
}
Я получаю
2
3
, которая на самом деле правильно ..
Так я искал в Интернете .., который говорит мне, что
void TraceLeaves(node *temp,int k,vector<int> v,vector<int> visited)
следует заменить на
void TraceLeaves(node *temp,int k,vector<int> v,vector<int> &visited)
Полный после этого изменения
#include<bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node *left;
struct node *right;
}*root;
node* createnode(int d)
{
node *New;
New = new node;
New->data = d;
New->left=NULL;
New->right=NULL;
}
void TraceLeaves(node *temp,int k,vector<int> v,vector<int>& visited)
{
if(temp->left==NULL&&temp->right==NULL)
{
v.push_back(temp->data);
if(visited[v.size()-k-1]==0)
{
visited[v.size()-k-1]=1;
cout<<v[v.size()-k-1]<<"\n";
}
return;
}
else
{
v.push_back(temp->data);
visited.push_back(0);
}
TraceLeaves(temp->left,k,v,visited);
TraceLeaves(temp->right,k,v,visited);
}
int main()
{
root = createnode(1);
root->left=createnode(2);
root->right=createnode(3);
root->left->left = createnode(4);
root->left->right = createnode(5);
root->right->left = createnode(6);
root->right->right = createnode(7);
vector<int> v;
vector<int> visited(5,0);
TraceLeaves(root,1,v,visited);
}
, но это дает мне выход
2
, как мы используем массив по ссылке означает, что изменения будут обновлены
2, 3 находятся на одном уровне. Так что только 2 печатается.
Так что мой вопрос
почему я получаю 2,3, как вывод, когда BOOL посещенных [] используется в коде и передается по ссылке и получение только 2, когда вектор & v используется ??
Заранее спасибо.
Как вы выполняете 'visit.push_back (0)' с 'bool visited []' (сохраняя тот же указатель)? – Jarod42
посетил [v.size() - 1] = 0, поскольку мы должны добавить только в конце. – sai
Просто тот факт, что 'push_back' * увеличивает * размер числа записей, а массивы * не может быть изменен размером, достаточно разницы, чтобы сделать оба образца кода, ну, разные. Если бы вы определили вектор так же, как и массив, то он был бы (или должен быть) без разницы. – PaulMcKenzie