import java.rmi.NoSuchObjectException;
public class ThreadTree {
public static void main(String[] args) {
ThreadHeroNode root = new ThreadHeroNode(1,"tom");
ThreadHeroNode node1 = new ThreadHeroNode(3,"tom");
ThreadHeroNode node2 = new ThreadHeroNode(6,"tom");
ThreadHeroNode node3 = new ThreadHeroNode(8,"tom");
ThreadHeroNode node4 = new ThreadHeroNode(10,"tom");
ThreadHeroNode node5 = new ThreadHeroNode(14,"tom");
root.setLeft(node1);
root.setRight(node2);
node1.setLeft(node3);
node1.setRight(node4);
node2.setLeft(node5);
ThreadcreatTree tree = new ThreadcreatTree();
/*tree.mid(root);
//10测试
tree.list(root);*/
tree.before(root);
System.out.println(node4.getLeft());
System.out.println(node4.getLeftType());
System.out.println(node4.getRight());
System.out.println(node4.getRightType());
}
}
class ThreadcreatTree{
private ThreadHeroNode root;
private ThreadHeroNode pre=null;
//中序线索化二叉树
public void mid(ThreadHeroNode node){
//处理左子节点
if (node == null){
return;
}
mid(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;
//处理右子节点
mid(node.getRight());
}
//前序线索化二叉树
public void before(ThreadHeroNode 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;
// 4. 递归处理左子树
if (node.getLeftType() == 0) {
before(node.getLeft());
}
// 5. 递归处理右子树
if (node.getRightType() == 0) {
before(node.getRight());
}
}
//遍历线索二叉树
public void list(ThreadHeroNode root){
ThreadHeroNode 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();
}
}
}
class ThreadHeroNode {
private int id;
private String name;
private ThreadHeroNode left;
private ThreadHeroNode right;
//定义一个标志为1表示前驱节点,为0表示后继节点
private int leftType = 0;
private int rightType = 0;
public ThreadHeroNode() {
}
public ThreadHeroNode(int id, String name) {
this.id = id;
this.name = name;
}
/**
* 获取
*
* @return id
*/
public int getId() {
return id;
}
/**
* 设置
*
* @param id
*/
public void setId(int id) {
this.id = id;
}
/**
* 获取
*
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
*
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
*
* @return left
*/
public ThreadHeroNode getLeft() {
return left;
}
/**
* 设置
*
* @param left
*/
public void setLeft(ThreadHeroNode left) {
this.left = left;
}
/**
* 获取
*
* @return right
*/
public ThreadHeroNode getRight() {
return right;
}
/**
* 设置
*
* @param right
*/
public void setRight(ThreadHeroNode right) {
this.right = right;
}
/**
* 获取
*
* @return leftType
*/
public int getLeftType() {
return leftType;
}
/**
* 设置
*
* @param leftType
*/
public void setLeftType(int leftType) {
this.leftType = leftType;
}
/**
* 获取
*
* @return rightType
*/
public int getRightType() {
return rightType;
}
/**
* 设置
*
* @param rightType
*/
public void setRightType(int rightType) {
this.rightType = rightType;
}
public String toString() {
return "ThreadHeroNode{id = " + id + ", name = " + name;
}
}
Java数据结构---线索化二叉树
最新推荐文章于 2024-09-25 10:59:43 发布