二叉树是一种非常经典的数据结构。如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。
下面我们随意构造出一棵二叉树,计算它的最大距离,如上图,节点之间单位距离为1,最大距离(红色线条)为5。
考虑使用中序遍历+递归的方法计算,用Java实现的代码如下:
package com.algo; public class LearnTree { //树的结构如下: /* 1 4 2 5 3 6 7*/ int maxLength = 0; public static void main(String[] args) { LearnTree learnTree = new LearnTree(); learnTree.calMaxLength(); System.out.println("二叉树最大距离:" + learnTree.maxLength); } public void calMaxLength() { Node head=new Node(); head.data=1; // 根节点赋初值 makeTree(head); // 构造一棵二叉树 calREC(head); // 中序遍历 + 递归计算 } public int calREC(Node head) { if(head == null) return 0; head.leftLen = head.left != null ? calREC(head.left) + 1 : 0; head.rightLen = head.right != null ? calREC(head.right) + 1 : 0; if(head.rightLen + head.leftLen > maxLength) maxLength = head.rightLen + head.leftLen; return head.rightLen>head.leftLen?head.rightLen:head.leftLen; } public void makeTree (Node head) { /* 1 4 2 5 3 6 7*/ Node node4=new Node(); node4.data=4; node4.parent=head; head.left=node4; Node node5=new Node(); node5.data=5; node5.parent=node4; node4.right=node5; Node node2=new Node(); node2.data=2; head.right=node2; node2.parent=head; Node node3=new Node(); node3.data=3; node3.parent=node2; node2.left=node3; Node node6=new Node(); node6.data=6; node6.parent=node2; node2.right=node6; Node node7=new Node(); node7.data=7; node7.parent=node6; node6.right=node7; } } /*定义二叉树的父节点,左右子节点,数据节点*/ class Node { Node parent=null; Node left=null; Node right=null; Object data=null; int leftLen; int rightLen; }