Binary search tree的遍历分为preorder traversal、inorder traversal、postorder traversal三种。
树节点的结构如下:
struct node
{
int sum;
string name;
struct node *left,*right;
};
preorder traversal递归遍历:
void preprint(*root)
{
if(root!=NULL){
preprint(root->left);
visit(root);
preprint(root->right);
}
}
改为不递归遍历:
void preOrder1(TNode* root)
{
Stack S;
while ((root != NULL) || !S.empty())
{
if (root != NULL)
{
Visit(root);
S.push(root); // 先序就体现在这里了,先访问,再入栈
root = root->left; // 依次访问左子树
}
else
{
root = S.pop(); // 回溯至父亲节点
root = root->right;
}
}
}
构建Binary search tree还有一个最重要的函数便是插入节点函数的写法,结合pojhttp://poj.org/problem?id=1002题目:
void insert(string t,node *p)
{
if(p->name==t)
{
p->sum++;
return ;
}
int y=t.compare(p->name);
if(y>0)
{
if(p->right==NULL)
{
p->right=new node;
p->right->right=p->right->left=NULL;
p->right->sum=1;
p->right->name=t;
}
else insert(t,p->right);
}
else
{
if(p->left==NULL)
{
p->left=new node();
p->left->right=p->left->left=NULL;
p->left->sum=1;
p->left->name=t;
}
else insert(t,p->left);
}
}
在main函数中,先定义根节点,再依次插入相应的节点。:
node *h;
h=new node();
h->sum=1;
h->right=h->left=NULL;