class ThreadedBinaryTree{
private Node root;
private Node pre=null;
public void setRoot(Node root) {
this.root = root;
}
public void threadNodes(){
this.threadedNodes(root);
}
//中序线索化
public void threadedNodes(Node node){
if(node==null)
return;
threadedNodes(node.getLeft());
if(node.getLeft()==null){
node.setLeft(pre);
node.setLeftType(1);
}
if(pre!=null&&pre.getRight()==null){
pre.setRight(node);
pre.setRightType(1);
}
pre=node;
threadedNodes(node.getRight());
}
//前序线索化
public void threadedNodesPre(Node node){
if(node==null)
return;
if(node.getLeft()==null)
{
node.setLeft(pre);
node.setLeftType(1);
}
if(pre!=null&&pre.getRight()==null){
pre.setRight(node);
pre.setRightType(1);
}
pre=node;
if(node.getLeftType()==0)
threadedNodes(node.getLeft());
if(node.getRightType()==0)
threadedNodes(node.getRight());
}
//后序线索化
public void threadedNodesPost(Node node){
if(node==null)
return;
if(node.getLeftType()==0)
threadedNodes(node.getLeft());
if(node.getRightType()==0)
threadedNodes(node.getRight());
if(node.getLeft()==null)
{
node.setLeft(pre);
node.setLeftType(1);
}
if(pre!=null&&pre.getRight()==null){
pre.setRight(node);
pre.setRightType(1);
}
pre=node;
}
}
Node节点类添加了:
private int leftType;//0表示指向左子树,1表示指向前驱节点
private int rightType;//0表示指向右子树,1表示指向后继节点
public int getLeftType() {
return leftType;
}
public int getRightType() {
return rightType;
}
public void setLeftType(int leftType) {
this.leftType = leftType;
}
public void setRightType(int rightType) {
this.rightType = rightType;
}
遍历中序线索化二叉树
//遍历中序线索化二叉树
public void threadedList(){
Node node=root;
while(node!=null){
while(node.getLeftType()==0)
node=node.getLeft();
System.out.println(node);
while(node.getRightType()==1){
node=node.getRight();
System.out.println(node);
}
node=node.getRight();
}
}
优势
(1)利用线索二叉树进行中序遍历时,不必采用堆栈处理,速度较一般二叉树的遍历速度快,且节约存储空间
(2)任意一个结点都能直接找到它的前驱和后继结点
不足
(1)结点的插入和删除麻烦,且速度也较慢
(2)线索子树不能共用
https://baike.baidu.com/item/%E7%BA%BF%E7%B4%A2%E4%BA%8C%E5%8F%89%E6%A0%91/10810037?fr=aladdin