数据结构和数据库有点相似的地方是,都要做一些增删查改之类的操作。
首先,定义一个二叉树node的结构体
typedef struct node *nodeLink;
struct node
{
int data;
nodeLink lChild, rChild;
};
其次,看递归方式的实现
/*
* pre-order: root->lChild->rChild
* in-order: lChild->root->rChild
* post-order: lChild->rChild->root
*/
void preorder(nodeLink root)
{
if(!root) return;
cout<<root->data<<endl;
preorder(root->lChild);
preorder(root->rChild);
}
void inorder(nodeLink root)
{
if(!root) return;
inorder(root->lChild);
cout<<root->data<<endl;
inorder(root->rChild);
}
void postorder(nodeLink root)
{
if(!root) return;
postorder(root->lChild);
postorder(root->rChild);
cout<<root->data<<endl;
}
编码时先把思路想清楚了,写出来就很流畅。
非递归实现的话,需要用堆栈实现类似递归的功能
void iterPreorder(nodeLink root)
{
int top=-1;
nodeLink stack[MAX_STACK_SZ];
while(TRUE)
{
if(!root) break;
cout<<root->data<<endl;
for(;root;root=root->lChild)
{
push(root);
}
root=root->rChild;
}
}
void iterInorder(nodeLink root)
{
int top=-1;
nodeLink stack[MAX_STACK_SZ];
while(TRUE)
{
for(;root;root=root->lChild)
{
push(root);
}
root = pop();
if(!root) break;
cout<<root->data<<endl;
root=root->rChild;
}
}
void iterPostorder(nodeLink root)
{
int top=-1;
nodeLink stack[MAX_STACK_SZ];
while(TRUE)
{
if(!root) break;
for(;root;root=root->lChild)
{
push(root);
}
root = pop();
root = root->rChild;
if(!root) break;
cout<<root->data<<endl;
}
}