package tree;
public class ThreadedBinaryTreeDemo {
public static void main(String[] args) {
HeroNode2 root = new HeroNode2(1,"宋江");
HeroNode2 node1 = new HeroNode2(3,"吴用");
HeroNode2 node2 = new HeroNode2(6,"卢俊义");
HeroNode2 node3 = new HeroNode2(8,"武松");
HeroNode2 node4 = new HeroNode2(10,"鲁智深");
HeroNode2 node5 = new HeroNode2(14,"花荣");
//手动生成树
root.setLeft(node1);
root.setRight(node2);
node1.setLeft(node3);
node1.setRight(node4);
node2.setLeft(node5);
ThreadedBinaryTree tree = new ThreadedBinaryTree();
tree.setRoot(root);
tree.thread();
System.out.println(node3.getLeft());
System.out.println(node3.getLeftType());
System.out.println(node3.getRight());
System.out.println(node3.getRightType());
System.out.println(node2.getLeft());
System.out.println(node2.getLeftType());
System.out.println(node2.getRight());
System.out.println(node2.getRightType());
tree.threadedList();
}
}
class ThreadedBinaryTree{
private HeroNode2 root;
private HeroNode2 pre = null;//记录当前节点的前一个节点
public void setRoot(HeroNode2 root) {
this.root = root;
}
public void thread(){
thread(root);
}
//线索化是将原本没有指向的节点添加节点信息
public void thread(HeroNode2 node){
if (node == null) {
return;
}
if (node.getLeft() != null) {
thread(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后移
pre = node;
if(node.getRight() != null){
thread(node.getRight());
}
}
public void threadedList(){
HeroNode2 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();
}
}
}
class HeroNode2{
private int no;
private String name;
private HeroNode2 left;
private HeroNode2 right;
private int leftType;
private int rightType;
public HeroNode2(int no, String name) {
this.no = no;
this.name = name;
}
//线索化
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HeroNode2 getLeft() {
return left;
}
public void setLeft(HeroNode2 left) {
this.left = left;
}
public HeroNode2 getRight() {
return right;
}
public void setRight(HeroNode2 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;
}
@Override
public String toString() {
return "HeroNode2{" +
"no=" + no +
", name='" + name + ''' +
'}';
}
}