1.原始树结构图:
2.代码:
结果是:8 10 3 14 6 1
public class ThreadedBinaryTreeDemo {
public static void main(String[] args) {
TreadedBinaryTree tree = new TreadedBinaryTree();
tree.postOrder();
}
}
class TreadedBinaryTree {
TreadedNode root = null;
TreadedNode pre = null;
public TreadedBinaryTree() {
root = new TreadedNode(1);
root.left = new TreadedNode(3);
root.left.parent = root;
root.left.left = new TreadedNode(8);
root.left.left.parent = root.left;
root.left.right = new TreadedNode(10);
root.left.right.parent = root.left;
root.right = new TreadedNode(6);
root.right.parent = root;
root.right.left = new TreadedNode(14);
root.right.left.parent = root.right;
postThreadedNodes(root);
}
/**
*
* @Description 后序遍历
* @author jiama
* @Date 2021年10月4日
*/
public void postOrder() {
// isFlag判断是否遍历到最底下
boolean isFlag = true;
// 判断子树右边是否遍历过
boolean isRightFlag = true;
// 开始的节点
TreadedNode cur = root;
// 如果isFlag是true则cur遍历到最底下位置,然后判断是否leftType为1(lefttype为1的情况就是
// 指向的是前驱节点,0为左子树,righttype为1的情况就是指向的是后继节点,0为右子树)
// 如果为1,则按照线索进行遍历直到不为lefttype不为1,这个时候cur就会回到子树头,再用rightFlag判断
// 是否为true,如果是true的话就再进行遍历到底,重新遍历该树直到回到子树头,循环操作该步,直到遇到root就停止
while (cur != null) {
if (isFlag) {
while (cur != null && cur.leftType == 0) {
cur = cur.left;
}
} else {
System.out.println(cur);
if (cur.parent == null) {
break;
}
cur = cur.parent;
if (!isRightFlag) {
cur = cur.parent;
isRightFlag = true;
if (cur == null) {
break;
}
}
if (isRightFlag) {
cur = cur.right;
isRightFlag = false;
isFlag = true;
continue;
}
isFlag = true;
}
while (cur != null && cur.rightType == 1) {
System.out.println(cur);
cur = cur.right;
isFlag = false;
}
}
}
/**
*
* @Description 后续线索化树
* @author jiama
* @Date 2021年10月3日
*/
public void postThreadedNodes(TreadedNode node) {
if (node == null) {
return;
}
// 左边递归
postThreadedNodes(node.left);
// 右边递归
postThreadedNodes(node.right);
// 处理
if (node != null && node.left == null) {
node.left = pre;
node.leftType = 1;
}
if (pre != null && pre.right == null) {
pre.right = node;
pre.rightType = 1;
}
pre = node;
}
}
class TreadedNode {
// 指向子树或者前驱结点
TreadedNode left;
// 指向子树或者后继结点
TreadedNode right;
TreadedNode parent;
int leftType;
int rightType;
int data;
public TreadedNode(int data) {
this.data = data;
}
@Override
public String toString() {
return "TreadedNode [leftType=" + leftType + ", rightType=" + rightType + ", data=" + data + "]";
}
}