线索化:二叉树的左子节点指向的是“前驱节点”,右子节点指向的是“后继节点”。
二叉树的线索化有三种:前序、中序和后序线索化,见下图:
下面是实现前序、中序和后序线索化的代码实现:
- 前序和中序线索化遍历大致差不多,只不过是顺序不同而已;
- 后序遍历和前序中序不同,需要给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;
}
//(一)先线索化左子树