Java二叉樹排序及任意兩點個節點間的最大距離

君墨痕發表於2013-11-28

網上看到的基本都是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);
	}
}

順帶附一張草稿圖便於理解


相關文章