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

来源:互联网 发布:linux延时函数 编辑:程序博客网 时间:2024/06/12 00:34

网上看到的基本都是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;// 如果左子树为空,那么该节点的左边最长距离为0if (root.left == null) {root.nMaxLeft = 0;}// 如果右子树为空,那么该节点的右边最长距离为0if (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);}}

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


原创粉丝点击