【数据结构】线索二叉树

1.线索二叉树的结构

public class Tree{
    private static class BTNode{
        public int data;
        public BTNode lchild;
        public BTNode rchild;
        //标签,00表示孩子,1表示线索树前后驱
        public int ltag;
        public int rtag;
    }
    private BTNode root;
}

2.二叉树的线索化及线索二叉树的遍历(以中序线索二叉树为例)

  • 与对应的二叉树的遍历顺序的递归形式类似,将visit()函数换成处理线索的代码

2.1中序二叉树的线索化

/**
 * 中序二叉树线索化
 * 外层结构类似中序遍历二叉树递归形式
 * 线索化是按照遍历顺序,遍历完当前节点就变成下个节点的前驱了
 * 处理当前节点前去和前驱节点后继
 */
private void inThread(BTNode p, BTNode pre){
    if(p != null){
        inThread(p.lchild, pre);
        if(p.lchild == null){
            p.ltag = 1;
            p.lchild = pre;
        }
        if(pre != null && pre.rchild == null){
            pre.rtag = 1;
            pre.rchild = p;
        }
        pre = p;
        inThread(p.rchild, pre);
    }
}
//中序二叉树线索化主程序
public void buildInThread(BTNode root){
    if(root != null){
        BTNode pre = null;
        inThread(root, pre);
        //处理最后一个节点后继
        pre.rchild = null;
        pre.rtag = 1;
    }
}

2.2中序线索二叉树的操作

//以p为根节点的,中序线索二叉树的第一个节点
public BTNode first(BTNode p){
    while(p.ltag == 0  ){
        p = p.lchild;
    }
    return p;
}

//以p为根节点的,中序线索二叉树的最后一个节点
public BTNode last(BTNode p){
    while(p.rtag == 0){
        p = p.rchild;
    }
    return p;
}

//求p在中序线索二叉树中的后继节点
public BTNode successor(BTNode p){
    if(p.rtag == 0){
        return first(p.rchild);
    }
    return p.rchild;
}

//求p在中序线索二叉树中的前驱节点
public BTNode precursor(BTNode p){
    if(p.ltag == 0){
        return last(p.lchild);
    }
    return p.lchild;
}

//遍历  
public void inorder(TBTNode root){  
    for(TBTNode p = first(root); p != null; p=successor(p)){  
        visit(p);  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值