让二叉树更好——三叉树和线索二叉树(遍历的简化)

本文介绍了三叉树和线索二叉树的概念,以简化二叉树的遍历过程。三叉树在二叉树基础上增加一个指针,方便查找路径和非递归遍历。线索二叉树则通过利用空指针存储前驱和后继信息,实现不借助栈的中序遍历。虽然线索二叉树在其他遍历方式上存在局限性,但提供了新的思考角度。
摘要由CSDN通过智能技术生成

你是否已经厌倦了,那只能找到孩子却不能反向寻找双亲结点,那遍历起来想要砸键盘的、陈旧的二叉树?今天,就是我们站起来了的时候了。(雾)
好了不皮了,先看一下定义

三叉树

这个名字不是指度最大为三的树,而是在二叉树(两个指针)的基础上多了个指针,因为二叉树找双亲结点只能用栈存储然后回溯,或者只能一个个结点的寻找,非常麻烦的。
(别问名字为什么这样,问就是学校ppt教的,不过也很形象)

好处:
首先就是找到从根节点到任意节点的路径方便了很多;
另外是在非递归遍历的时候,之前的二叉树结构想要回溯就只能借助栈,而现在不一样了,随时随地都能回溯。

typedef struct Btree//树的结构体
{
   
    char data;
    struct Btree* lchild;
    struct Btree* rchild;
    struct Btree* parent;
}btree;

结构体没什么好说的,只需要在之前的setup函数中对两个孩子调用的时候
那遍历起来什么样子呢?(中序为例)

void InOrder(btree* bt)
{
   
    btree* p=bt, *pr=NULL;
    while(p)
    {
   
        if(p->lchild)//走到最左
            p=p->lchild;
        else 
        {
   
            cout<<p->data<< " ";
            if(p->rchild)//有右子树直接走了
                p=p->rchild;
            else //没有就要回溯
            {
   
                pr=p;
                p=p->parent;
                while (p && (p->lchild != pr || !p->rchild))//找到有右子树的结点
                {
   
                    if(p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值