2025-01-21 线索化二叉树
This commit is contained in:
parent
d9355923ec
commit
a2342522af
147
src/dataANDcalc/java/tree/ThreadedBinaryTree.java
Normal file
147
src/dataANDcalc/java/tree/ThreadedBinaryTree.java
Normal file
@ -0,0 +1,147 @@
|
||||
package tree;
|
||||
|
||||
public class ThreadedBinaryTree {
|
||||
|
||||
private TreeNode root;
|
||||
|
||||
private TreeNode prev;
|
||||
|
||||
private void transTree(int[] arr){
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
TreeNode treeNode = new TreeNode(arr[i]);
|
||||
addNode(root, treeNode);
|
||||
}
|
||||
}
|
||||
|
||||
private void addNode(TreeNode tempNode, TreeNode treeNode){
|
||||
if(root == null){
|
||||
root = treeNode;
|
||||
return;
|
||||
}
|
||||
|
||||
if(treeNode.node<tempNode.node){
|
||||
if (tempNode.left == null){
|
||||
tempNode.left = treeNode;
|
||||
} else {
|
||||
addNode(tempNode.left, treeNode);
|
||||
}
|
||||
}
|
||||
|
||||
if(treeNode.node>tempNode.node){
|
||||
if (tempNode.right == null){
|
||||
tempNode.right = treeNode;
|
||||
} else {
|
||||
addNode(tempNode.right, treeNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//left指向的是左子树,也可能是指向的前驱节点;right指向的是右子树,也有可能是指向后继节点
|
||||
public void middleThreadNode(TreeNode treeNode){
|
||||
if (treeNode == null){
|
||||
return;
|
||||
}
|
||||
|
||||
//先线索化左子树
|
||||
middleThreadNode(treeNode.left);
|
||||
|
||||
//处理当前节点的前驱节点
|
||||
if (treeNode.left == null){
|
||||
// 如果当前节点的左指针为空,则左指针类型就为前驱节点,并且指向前驱节点
|
||||
treeNode.left = prev;
|
||||
treeNode.leftType = 1;
|
||||
} else {
|
||||
treeNode.leftType = 0;
|
||||
}
|
||||
//处理当前节点的后继节点
|
||||
if (prev != null){
|
||||
if (prev.right == null){
|
||||
// 如果前驱节点的右指针为空,则前驱节点的右指针类型就为后继节点,并且指向当前节点
|
||||
prev.right = treeNode;
|
||||
prev.rightType = 1;
|
||||
} else {
|
||||
prev.rightType = 0;
|
||||
}
|
||||
}
|
||||
|
||||
prev = treeNode;
|
||||
|
||||
//线索化右子树
|
||||
middleThreadNode(treeNode.right);
|
||||
}
|
||||
|
||||
private void middleIterator(TreeNode treeNode){
|
||||
if(treeNode == null){
|
||||
System.out.println("当前节点为空");
|
||||
return;
|
||||
}
|
||||
TreeNode temp = root;
|
||||
|
||||
while(true){
|
||||
if(temp == null){
|
||||
break;
|
||||
}
|
||||
// 一直向左搜索到有线索指针为止
|
||||
if(temp.leftType == 0){
|
||||
temp = temp.left;
|
||||
}
|
||||
|
||||
while(true){
|
||||
// 找到线索指针之后,一直根据后继指针输出,直到节点右指针不为线索指针为止
|
||||
if(temp.rightType == 1){
|
||||
System.out.println(temp);
|
||||
temp = temp.right;
|
||||
}
|
||||
break;
|
||||
}
|
||||
System.out.println(temp);
|
||||
|
||||
// 如果节点的右指针不为线索指针,则向右节点检索
|
||||
if(temp.rightType == 0){
|
||||
temp = temp.right;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class TreeNode{
|
||||
|
||||
private int node;
|
||||
|
||||
private TreeNode left;
|
||||
|
||||
private TreeNode right;
|
||||
|
||||
private int leftType; // 0表示指向左子树,1表示指向前驱节点
|
||||
|
||||
private int rightType; // 0表示指向右子树,1表示指向后继节点
|
||||
|
||||
public TreeNode(int node) {
|
||||
this.node = node;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TreeNode{" +
|
||||
"node=" + node +
|
||||
", leftType=" + leftType +
|
||||
", rightType=" + rightType +
|
||||
", left=" + (left == null ? "null" : left.node) +
|
||||
", right=" + (right == null ? "null" : right.node) +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] arr = {7, 3, 10, 12, 5, 1, 9};
|
||||
ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree();
|
||||
threadedBinaryTree.transTree(arr);
|
||||
/**
|
||||
7
|
||||
3 10
|
||||
1 5 9 12
|
||||
**/
|
||||
threadedBinaryTree.middleThreadNode(threadedBinaryTree.root);
|
||||
threadedBinaryTree.middleIterator(threadedBinaryTree.root);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user