【发布时间】:2016-05-15 07:54:22
【问题描述】:
我对下面二叉树代码中的数组和向量有些疑惑。
下面是找到的代码 打印距离叶节点k距离的所有节点
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
当我将 vectorvisited 数组替换为 boolvisited[]
喜欢
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 被打印出来。
所以我的问题是
为什么在代码中使用 boolvisited[] 并通过引用传递时我得到 2,3 作为输出,而当使用向量 &v 时只得到 2 ??
提前致谢。
【问题讨论】:
-
visited.push_back(0)和bool visited[]怎么做(保持相同的指针)? -
visited[v.size()-1]=0 因为我们只需要在末尾添加。
-
仅仅
push_back增加条目数的大小,而数组不能调整大小的事实就足以改变使两个代码示例都不同。如果您将向量的大小设置为与前面的数组相同,那么将(或应该)没有区别。 -
visited[v.size()-1]=0-- 可以替换为更直观的visited.back() = 0; -
这里我得到了不同的向量输出。你能告诉我如何在向量的帮助下获得 2,3 输出吗?如果我使用按引用传递意味着它只得到 2 但是当我们通过引用传递布尔数组时,我们得到 2,3
标签: c++ arrays vector binary-tree pass-by-reference