public class ThreadedBinaryTree {
public static void main(String[] args){
Heronodes node1=new Heronodes(1,"李牧");
Heronodes node2=new Heronodes(2,"萧炎");
Heronodes node3=new Heronodes(3,"李太玄");
Heronodes node4=new Heronodes(4,"周明瑞");
Heronodes node5=new Heronodes(5,"克莱恩");
Heronodes node6=new Heronodes(6,"老尼尔");
Heronodes node7=new Heronodes(7,"邓恩");
node1.setLeft(node2);
node1.setRight(node3);
node2.setParent(node1);
node3.setParent(node1);
node2.setLeft(node4);
node2.setRight(node5);
node4.setParent(node2);
node5.setParent(node2);
node3.setLeft(node6);
node6.setParent(node3);
node3.setRight(node7);
node7.setParent(node3);
// ThreadBinaryTree infixBinaryTree=new ThreadBinaryTree(node1);
// infixBinaryTree.infixThreadBinaryTree(node1);
// infixBinaryTree.infixList();
// ThreadBinaryTree preBinaryTree=new ThreadBinaryTree(node1);
// preBinaryTree.preTheadBinaryTree(node1);
// preBinaryTree.preList();
//
ThreadBinaryTree lastBinaryTree=new ThreadBinaryTree(node1);
lastBinaryTree.lastThreadBinaryTree(node1);
lastBinaryTree.lastList();
}
}
class ThreadBinaryTree{
private Heronodes root;
private Heronodes pre=null;
public ThreadBinaryTree(Heronodes root) {
this.root = root;
}
// public void setEachParent(Heronodes node){//待定,给每一个标注出parentNode
// Heronodes preNode=null;
// if (node.getLeft()!=null){
// preNode=node;
// node=node.getLeft();
// node.setParent(preNode);
// }
// setEachParent(node.getLeft());
// if (node.getRight()!=null){
// preNode=
// }
//
//
//
//
//
// }
//中序线索化
public void infixThreadBinaryTree(Heronodes node){
if(node==null){
return;
}
infixThreadBinaryTree(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;
infixThreadBinaryTree(node.getRight());
}
//中序线索化的遍历
public void infixList(){
Heronodes node=root;
while (node!=null){
while (node.getLeftType()!=1){
node=node.getLeft();
}
System.out.println(node);
while (node.getRightType()==1){
node=node.getRight();
System.out.println(node);
}
node=node.getRight();
}
}
//前序线索化
public void preTheadBinaryTree(Heronodes 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()!=1){
preTheadBinaryTree(node.getLeft());
}
if (node.getRightType()!=1){
preTheadBinaryTree(node.getRight());
}
}
//前序线索化遍历
public void preList(){
Heronodes node =root;
while (node!=null){
while (node.getLeftType()!=1){
System.out.println(node);
node=node.getLeft();
}
System.out.println(node);
node=node.getRight();
}
}
//后序线索化
public void lastThreadBinaryTree(Heronodes node){
if (node==null){
return;
}
lastThreadBinaryTree(node.getLeft());
lastThreadBinaryTree(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;
}
//遍历后序线索化二叉树
public void lastList(){
Heronodes node =root;
while (node!=null&&node.getLeftType()!=1){
node=node.getLeft();
}
Heronodes preNode=null;
while (node!=null){
if (node.getRightType()==1){
System.out.println(node);
preNode=node;
node=node.getRight();
}else {
if (preNode==node.getRight()){
System.out.println(node);
if (node==root){
return;
}
preNode=node;
node=node.getParent();
}else {
node=node.getRight();
while (node!=null&&node.getLeftType()!=1){
node=node.getLeft();
}
}
}
}
}
}
class Heronodes{
private int number;
private String name;
private Heronodes left;
private Heronodes right;
private Heronodes parent;
private int leftType=0;//leftType=1时,代表前序,leftType=0时,代表左子树 初始情况下为0,后序线索化后将会改变
private int rightType=0;//rightType=1时,代表后序,rightType=0时,代表右子树
public Heronodes getParent() {
return parent;
}
public void setParent(Heronodes parent) {
this.parent = parent;
}
@Override
public String toString() {
return "Heronodes{" +
"number=" + number +
", name='" + name + '\'' +
'}';
}
public Heronodes(int number, String name) {
this.number = number;
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Heronodes getLeft() {
return left;
}
public void setLeft(Heronodes left) {
this.left = left;
}
public Heronodes getRight() {
return right;
}
public void setRight(Heronodes right) {
this.right = right;
}
public int getLeftType() {
return leftType;
}
public void setLeftType(int leftType) {
this.leftType = leftType;
}
public int getRightType() {
return rightType;
}
public void setRightType(int rightType) {
this.rightType = rightType;
}
}
其实做下来就一个感觉,真难啊!自己智商根本不够用的感觉,但是诸位,还要坚持!
共勉!