算法題之求二叉樹的最大距離


二叉樹是一種非常經典的數據結構。如果我們把二叉樹看成一個圖,父子節點之間的連線看成是雙向的,我們姑且定義"距離"為兩節點之間邊的個數。寫一個程序求一棵二叉樹中相距最遠的兩個節點之間的距離。

下面我們隨意構造出一棵二叉樹,計算它的最大距離,如上圖,節點之間單位距離為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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM