前序、中序和后序线索化二叉树及其遍历

线索化:二叉树的左子节点指向的是“前驱节点”,右子节点指向的是“后继节点”。
二叉树的线索化有三种前序中序后序线索化,见下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面是实现前序、中序和后序线索化的代码实现:

  • 前序中序线索化遍历大致差不多,只不过是顺序不同而已;
  • 后序遍历和前序中序不同,需要给Node节点添加parent属性,借助parent属性进行后序线索化遍历。

代码实现
定义Node节点类

class HeroNode {
   
    private int no;
    private String name;
    private HeroNode left; //默认null
    private HeroNode right; //默认null
    private HeroNode parent;//默认null,父节点的指针(为了后序线索化使用)
    //说明
    //1. 如果leftType == 0 表示指向的是左子树, 如果 1 则表示指向前驱结点
    //2. 如果rightType == 0 表示指向是右子树, 如果 1表示指向后继结点
    private int leftType;
    private int rightType;
}

构建二叉树

//定义ThreadedBinaryTree 实现了线索化功能的二叉树
class ThreadedBinaryTree {
   
    private HeroNode root;

    //为了实现线索化,需要创建要给指向当前结点的前驱结点的指针
    //在递归进行线索化时,pre 总是保留前一个结点
    private HeroNode pre = null;

    public void setRoot(HeroNode root) {
   
        this.root = root;
    }

    //重载threadedNodes方法
    public void threadedNodes() {
   
        this.threadedNodes(root);
    }

    //重载preThreadedNodes
    public void preThreadedNodes() {
   
        this.preThreadedNodes(root);
    }

    //重载postThreadedNodes
    public void postThreadedNodes() {
   
        this.postThreadedNodes(root);
    }

      
    /**
     * 中序线索化二叉树
     *
     * @param node 就是当前需要线索化的结点
     */
    public void threadedNodes(HeroNode node) {
   

        //如果node==null, 不能线索化
        if (node == null) {
   
            return;
        }

        //(一)先线索化左子树
        
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值