(1)二叉排序树的查找算法
typedef struct Node
{
int data; //结点值
struct Node *parent; //父结点
struct Node *lchild; //左结点
struct Node *rchild; //右结点
}TREENODE;
TREENODE *Search(TREENODE *root,int value)
{
if(root!=NULL)
{
if(root->data==value)
{
return root;
}
else
{
if(value < root->data)
{
Search(root->lchild,value); //如果查找值比结点值小,递归左子树
}
else
{
Search(root->rchild,value); //如果查找值比结点值大,递归右子树
}
}
}
return root;
}
int preorder_traverse(bitree bt, int (*visit)(elemtype e))
{
sqstack s;
bitree p;
init_stack(&s);
p = bt;
while (p || !is_stack_empty(s)) {
while (p) { /* 左结点依次进栈,向左走到尽头 */
visit(p->data);
push_stack(&s, p);
p = p->lchild;
}
if (!is_stack_empty(s)) {
pop_stack(&s, &p); /* 出栈 */
p = p->rchild;
}
}
return OK;
}
(2) 中序
借助栈,思路同先序,只是在出栈的时候才访问结点
int inorder_traverse(bitree bt, int (*visit)(elemtype e))
{
sqstack s;
bitree p;
init_stack(&s);
p = bt;
while (p || !is_stack_empty(s)) {
while (p) {
push_stack(&s, p);
p = p->lchild;
}
if (!is_stack_empty(s)) {
pop_stack(&s, &p);
visit(p->data);
p = p->rchild;
}
}
return OK;
}
(3) 后序
借助栈,左右子树分别进栈,只是在结点没有右子树或者右子树已经被访问的情况下,才将该节点出栈并访
int postorder_traverse(bitree bt, int (*visit)(elemtype e))
{
sqstack s;
bitree p, q;
init_stack(&s);
p = bt;
q = NULL;
while (p || !is_stack_empty(s)) {
while (p) {
push_stack(&s, p);
p = p->lchild;
}
if (!is_stack_empty(s)) {
get_top(s, &p); /* 取栈顶元素 */
if (!p->rchild || p->rchild == q) { /* 如果p没有右孩子,或右孩子已经访问过 */
visit(p->data);
q = p;
p = NULL;
--s.top;/* 退栈 */
}
else
p = p->rchild;
}
}
return OK;
}
(4) 层序
借助队列,根节点首先进队列,如果队列不为空的话,访问结点值,并出队列,然后左孩子进队列(如果有的话),右孩子进队列(如果有的话)。
int levelorder_traverse(bitree bt, int (*visit)(elemtype e))
{
sqqueue sq;
bitree cur;
init_queue(&sq);
if (bt) {
in_queue(&sq, bt);
while (!is_queue_empty(sq)) {
out_queue(&sq, &cur);
visit(cur->data);
if (cur->lchild)
in_queue(&sq, cur->lchild);
if (cur->rchild)
in_queue(&sq, cur->rchild);
}
}
return OK;
}
“`