线索化二叉树的目的是为了让所有的节点的左右指针都有用武之处。一般的前中后序的便利方法并不是用到所有结点的所有指针,而线索化二叉树可以使没有用到的指针赋予新的指向方式。
(1)n个结点的二叉树有n+1个空指针域,利用二叉树中的空指针域,去存放指向该结点在某中遍历次序下的前驱和后继结点指针(这种附加的指针称为“线索”)
(2)这种加上了线索的二叉树称为线索化二叉树。根据线索执行性质可以分为前序线索二叉树,中序线索二叉树,后序线索二叉树三种。
(3)一个结点的前一个结点: 前驱节点
(4)一个结点的后一个结点: 后继结点
下面通过应用案例深入理解线索化二叉树
将下面的二叉树{}进行中序线索二叉树
package com.tree;
/**
* created by wyl.. on 2019-08-27 下午 08:28
*/
public class ThreadBinaryTree<E> {
static class Node<E>{
E e;
private Node left;
private Node right;
private int leftType;
private int rigthType;
public Node(E e) {
this.e = e;
}
public E getE() {
return e;
}
public void setE(E e) {
this.e = e;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public int getLeftType() {
return leftType;
}
public void setLeftType(int leftType) {
this.leftType = leftType;
}
public int getRigthType() {
return rigthType;
}
public void setRigthType(int rigthType) {
this.rigthType = rigthType;
}
@Override
public String toString() {
return "Node{" +
"e=" + e +
'}';
}
public void infixOrder(){
if (this.left != null) {
this.left.infixOrder();
}
System.out.println(this);
if (this.right != null) {
this.right.infixOrder();
}
}
}
private Node root;
private Node pre=null;//保留前驱节点的指针
public void setRoot(Node root) {
this.root = root;
}
public void thread(){
this.thread(root);
}
//遍历线索化二叉树的方法
public void threadList(){
}
//进行线索化方法
public void thread(Node node){
if (node == null) {
return;
}
//先进行左结点线索化
thread(node.getLeft());
//再进行当前结点
if (node.getLeft() == null) {
node.setLeft(pre);//例如 8 结点 的左指向为pre 此时的pre为空
node.setLeftType(1);
}
//处理后继结点
if (pre!=null && pre.getRight()==null) {
pre.setRight(node);
pre.setRigthType(1);
}
pre=node;
thread(node.getRight());
}
}
来源:https://blog.csdn.net/qq_36178454/article/details/100107726