您的位置:首页 > 其它

算法导论 第12章 12-2 基数树

2015-02-01 17:05 141 查看
算法导论 第12章思考题 基数树

题目



解决思路:

很显然,这是关于二叉查找树的应用,主要是运用插入和遍历。

关于插入,遍历01字符串,从根节点开始,经过一段时间的插入,现在进行到节点x,如果当前遇到的字符是0,且x的左孩子存在,则直接向左走,否则创建一个新节点成为x的左孩子,然后走到此节点;如果当前遇到的字符是1,且右孩子存在,则直接向右走,否则创建一个新节点成为x的右孩子,然后走到此节点。如此循环之后,如果当前字符恰好为字符串最后一个字符,那么就像给字符串存储到该节点,而之前所有遍历的节点中都存储空字符串。

关于遍历,既然要输出排序结果,根据我们这里的插入方式,需要选择先序遍历了。遍历过程中需要注意,如果遇到的节点存储非空字符串,则输出;否则,跳过。

下面是基数树的代码:

#include<iostream>
#include<string>

using namespace std;

typedef struct Node
{
struct Node *left;
struct Node *right;
string str;
Node() :left(NULL), right(NULL){}
}node, RTree;

void insertRadixTree(RTree *rt, const string &str)
{
node *curr = rt;
if (curr == NULL) return;
for (string::size_type i = 0; i != str.size(); ++i)
{//遍历每一个字符串
if (str[i] == '0')
{//若当前字符为0,则往左走
if (curr->left == NULL)
curr->left = new node();
curr = curr->left;
}
else
{//为1则往右走
if (curr->right == NULL)
curr->right = new node();
curr = curr->right;
}
if (i == str.size() - 1)
curr->str = str;
}
}

void createRadixTree(RTree *rt)
{
string str;
cout << "Enter some 0_1 strings,CTRL+Z to end" << endl;
while (cin >> str)
insertRadixTree(rt, str);
cin.clear();
}

void preTraversal(RTree *rt)
{//先序遍历
if (rt != NULL)
{
if (rt->str != "")
cout << rt->str << endl;
preTraversal(rt->left);//递归遍历左子树
preTraversal(rt->right);//递归遍历右子树
}
}
void destroy(node *root)
{
if (root == NULL) return;
destroy(root->left);
destroy(root->right);
delete root;
}

int main()
{
RTree *rt = new node();
createRadixTree(rt);
preTraversal(rt);
destroy(rt);
getchar();
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: