二叉樹是一種非常經典的數據結構。如果我們把二叉樹看成一個圖,父子節點之間的連線看成是雙向的,我們姑且定義"距離"為兩節點之間邊的個數。寫一個程序求一棵二叉樹中相距最遠的兩個節點之間的距離。
下面我們隨意構造出一棵二叉樹,計算它的最大距離,如上圖,節點之間單位距離為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; }