如何移除C++中BST范围搜索结果的末尾逗号?
解决BST范围搜索输出末尾多余逗号的问题
你的BST范围搜索代码目前会输出15,20,24,,末尾多了一个不必要的逗号,下面给你两种实用的解决办法:
方法一:用标记控制逗号输出
递归过程中记录是否是第一个符合条件的元素,只有非第一个元素前才输出逗号,从根源避免末尾多出来的逗号。修改nodesInRange函数,增加一个引用类型的标记变量:
#include<bits/stdc++.h> using namespace std; class node{ public: int data; node *left; node *right; }; // 新增bool& first标记参数,控制逗号输出时机 void nodesInRange(node *root, int k1, int k2, bool& first){ if ( NULL == root ) return; if ( k1 < root->data ) nodesInRange(root->left, k1, k2, first); if ( k1 <= root->data && k2 >= root->data ){ if(!first){ cout<<","; // 非第一个元素前加逗号 } else { first = false; // 第一个元素输出后,标记置为false } cout<<root->data; } if ( k2 > root->data ) nodesInRange(root->right, k1, k2, first); } node* insert(int data){ node *temp = new node(); temp->data = data; temp->left = NULL; temp->right = NULL; return temp; } int main(){ node *root = new node(); int k1 = 12, k2 = 25; root = insert(20); root->left = insert(10); root->right = insert(24); root->left->left = insert(8); root->left->right = insert(15); root->right->right = insert(32); cout<<"The values of node within the range are\t"; bool first = true; // 初始化标记为第一个元素 nodesInRange(root, k1, k2, first); cout<<endl; return 0; }
方法二:先收集元素再统一输出
先把所有符合范围的节点值存到容器中,之后再遍历输出,这种方式逻辑更清晰,也方便后续对结果做其他处理:
#include<bits/stdc++.h> using namespace std; class node{ public: int data; node *left; node *right; }; // 把符合条件的元素收集到vector中 void collectNodesInRange(node *root, int k1, int k2, vector<int>& res){ if ( NULL == root ) return; if ( k1 < root->data ) collectNodesInRange(root->left, k1, k2, res); if ( k1 <= root->data && k2 >= root->data ){ res.push_back(root->data); } if ( k2 > root->data ) collectNodesInRange(root->right, k1, k2, res); } node* insert(int data){ node *temp = new node(); temp->data = data; temp->left = NULL; temp->right = NULL; return temp; } int main(){ node *root = new node(); int k1 = 12, k2 = 25; root = insert(20); root->left = insert(10); root->right = insert(24); root->left->left = insert(8); root->left->right = insert(15); root->right->right = insert(32); cout<<"The values of node within the range are\t"; vector<int> res; collectNodesInRange(root, k1, k2, res); // 遍历输出,处理逗号格式 for(int i=0; i<res.size(); i++){ if(i>0) cout<<","; cout<<res[i]; } cout<<endl; return 0; }
这两种方法都能输出15,20,24的正确格式,第二种方法更灵活,比如后续要对结果排序、统计数量都很容易扩展。
内容的提问来源于stack exchange,提问作者ace
相关产品推荐
相关产品推荐

