栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

后序线索化树创建与遍历

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

后序线索化树创建与遍历

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);
	}

	
	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;
			}
		}
	}

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

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/293209.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号