后序线索化树创建与遍历

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 + "]";
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值