package com.haiyang.datastructure.threadbinarytree;
/**
* @author haiYang
* @create 2022-01-15 15:45
*/
public class ThreadedBinaryTree {
public static void main(String[] args) {
TTreeNode root = new TTreeNode(1, "haiyang");
TTreeNode node1 = new TTreeNode(2, "haiyang1");
TTreeNode node2 = new TTreeNode(3, "haiyang2");
TTreeNode node3 = new TTreeNode(4, "haiyang3");
TTreeNode node4 = new TTreeNode(5, "haiyang4");
root.setLeft(node1);
root.setRight(node2);
node1.setLeft(node3);
node1.setRight(node4);
ThreadBinaryTree binaryTree = new ThreadBinaryTree(root);
binaryTree.threadedBinaryTree(root);
binaryTree.threadedList();
}
}
class ThreadBinaryTree {
private TTreeNode root;
private TTreeNode pre = null;
public ThreadBinaryTree(TTreeNode root) {
this.root = root;
}
//中序线索树的构建
public void threadedBinaryTree(TTreeNode node){
if(node==null){
return;
}
//线索化左子树
threadedBinaryTree(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;//维护pre节点位置
//线索化右子树
threadedBinaryTree(node.getRight());
}
//遍历中序线索二叉树
public void threadedList(){
TTreeNode node = root;
while(node != null){
//找到第一个左指针类型为1的节点开始遍历
while(node.getLeftType() == 0){
node = node.getLeft();
}
//遍历该节点
System.out.println(node);
//如果该节点的右指针类型为1,直接打印右指针所指节点
while(node.getRightType() == 1){
node = node.getRight();
System.out.println(node);
}
//如果有指针类型不为1,通过右指针向下继续寻找
node = node.getRight();
}
}
}
class TTreeNode {
private int no;
private String name;
private TTreeNode left;
private TTreeNode right;
private int leftType;//用于记录左指针类型是否是线索化指针,0代表否,1代表是
private int rightType;//用于记录右指针类型是否是线索化指针,0代表否,1代表是
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;
}
public TTreeNode(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 TTreeNode getLeft() {
return left;
}
public void setLeft(TTreeNode left) {
this.left = left;
}
public TTreeNode getRight() {
return right;
}
public void setRight(TTreeNode right) {
this.right = right;
}
@Override
public String toString() {
return "TTreeNode{" +
"no=" + no +
", name='" + name + '\'' +
", leftType=" + leftType +
", rightType=" + rightType +
'}';
}
}
数据结构之中序线索二叉树的构建及遍历(java)
最新推荐文章于 2023-03-01 20:50:15 发布