树的相关知识

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

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;

}
“`

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值