【数据结构和算法】中序线索化二叉树

 详细了解请参考https://blog.csdn.net/UncleMing5371/article/details/54176252

一、线索化二叉树的实现

下面介绍的是我对中序化线索化二叉树理解,我会用尽量简洁语言描述关键步骤。

1.线索化二叉树,所以线索化的方法是写在二叉树里的,而且pre节点也是定义在二叉树的成员变量里的;

2.涉及到二叉树因此遍历,递归少不了,先确定递归终止条件,这里是当前节点代入线索化方法node.thread();发现自己为null,则return即可。

3.由于是中序遍历,即先处理左子树,再处理自身,再再处理右子树。详情见下图

4.//处理当前节点的后继节点,由于使用了递归,且是单链表,所以要使用相对的手法
        //用pre当前节点node是上面处理前驱节点的node的下一个节点

以下是核心实现代码: 

public void thread(ThreadedNode node) {
    	//递归结束条件
		if(node == null) {
			return;
		}
		//处理左子树
		thread(node.leftNode);
		//处理节点自身
		//处理前驱
		if(node.leftNode == null) {
			//设置指针指向前驱节点
			node.leftNode = pre;
			//改变节点类型,为指向前驱
			node.leftType = 1;
		}
        //上面处理前驱节点的node和现在处理后继节点的node不一样了
        //这里的node已经移动到了下一个节点
		//处理后继
		if(pre != null && pre.rightNode == null) {
			//设置前驱节点指针指向当前节点
			pre.rightNode = node;
			//改变节点类型,为指向后继(相对来说)
			pre.rightType = 1;
		}
		
		//每处理一个节点,当前节点是下一个节点的前驱节点
		pre = node;
		//处理右子树
		thread(node.rightNode);
		
	}

 

二、中序线索化二叉树的遍历

//遍历中序线索化二叉树,不能再用原来的递归方法,因为指针分了两种类型
	public void threadList(ThreadedNode node) {
		while(node != null) {
        //因为是中序遍历,所以循环找到最左边的叶子节点
			while(node.getLeftType() == 0) {
				node = node.getLeftNode();
			}
            //打印最左的叶子节点
			System.out.print(node.getData()+" ");
			//如果当前节点的右指针指向后继节点,则一直输出
			while(node.getRightType() == 1) {
				node = node.getRightNode();
				System.out.print(node.getData()+" ");
			}
			//当右指针指的是右子节点,则替换和循环配合形成遍历
			node = node.getRightNode();
		}
	}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值