Java二叉树排序及任意两点个节点间的最大距离

网上看到的基本都是c或c++实现的,参照同样的算法写了个java版的。

参考文章地址:http://blog.csdn.net/cxh342968816/article/details/6656473

传一个无序数组到buildTree()方法里,会递归生成一个有序的二叉树,在按照排序递归打印到控制台。

countMaxDistance()方法是计算任意两点个节点间的最大距离

/**
 * @Description : 描述
 * @author YangXuan
 * @email 364105996@qq.com
 * @date 2013-11-25 下午8:21:13
 */
public class Quest1 {

	/**
	 * @Description : 节点实体
	 */
	private class Node {
		Node left;
		Node right;
		int nValue;
		int nMaxLeft;
		int nMaxRight;

		Node(int data) {
			nValue = data;
		}
	}

	private Node root;
	private int maxDistance = 0;

	public Quest1(Node root) {
		this.root = root;
	}

	/**
	 * @Description: 将数据插入二叉树并使之有序
	 * @return Node 返回类型
	 */
	private Node insert(Node node, int data) {
		if (node == null) {
			node = new Node(data);
		} else {
			if (data <= node.nValue) {
				node.left = insert(node.left, data);
			} else {
				node.right = insert(node.right, data);
			}
		}
		return node;
	}

	/**
	 * @Description: 将数组转换成二叉树
	 * @return void 返回类型
	 */
	public void buildTree(int[] data) {
		for (int i = 0; i < data.length; i++) {
			root = insert(root, data[i]);
		}
	}

	/**
	 * @Description: 打印有序二叉树
	 * @return void 返回类型
	 */
	private void printTree(Node node) {

		if (node == null)
			return;
		printTree(node.left);
		System.out.print(node.nValue + "  ");
		printTree(node.right);
	}

	public void printTree() {
		printTree(root);
	}

	private void maxDistance(Node root) {
		// 遍历到叶子节点,返回
		if (root == null)
			return;

		// 如果左子树为空,那么该节点的左边最长距离为0
		if (root.left == null) {
			root.nMaxLeft = 0;
		}

		// 如果右子树为空,那么该节点的右边最长距离为0
		if (root.right == null) {
			root.nMaxRight = 0;
		}

		// 如果左子树不为空,递归寻找左子树最长距离
		if (root.left != null) {
			maxDistance(root.left);
		}

		// 如果右子树不为空,递归寻找右子树最长距离
		if (root.right != null) {
			maxDistance(root.right);
		}

		// 计算左子树最长节点距离
		if (root.left != null) {
			int nTempMax = 0;
			if (root.left.nMaxLeft > root.left.nMaxRight) {
				nTempMax = root.left.nMaxLeft;
			} else {
				nTempMax = root.left.nMaxRight;
			}
			root.nMaxLeft = nTempMax + 1;
		}

		// 计算右子树最长节点距离
		if (root.right != null) {
			int nTempMax = 0;
			if (root.right.nMaxLeft > root.right.nMaxRight) {
				nTempMax = root.right.nMaxLeft;
			} else {
				nTempMax = root.right.nMaxRight;
			}
			root.nMaxRight = nTempMax + 1;
		}

		// 更新最长距离
		if (root.nMaxLeft + root.nMaxRight > maxDistance) {
			maxDistance = root.nMaxLeft + root.nMaxRight;
		}
	}

	public void countMaxDistance() {
		maxDistance(root);
	}

	public static void main(String[] args) {
		Node root = null;
		Quest1 a = new Quest1(root);
		int[] data = { 9, 6, 4, 8, 7, 3, 15, 13, 16, 18, 14, 15, 15, 16 };
		a.buildTree(data);
		a.countMaxDistance();
		a.printTree();
		System.out.println();
		System.out.println("任意两个节点间的最大距离为 : " + a.maxDistance);
	}
}

顺带附一张草稿图便于理解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝶泳奈何桥.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值