計算二叉樹任意兩個節點之間的最短路徑長度(Java)

題目

計算二叉樹任意兩個節點之間的最短路徑長度
例如:

在這個二叉樹中,計算節點7和節點3的最短路徑長度
輸出4(7—4—2—1—3)

思路

  1. 先找出兩個節點的最近公共祖先(在上面的例子中,節點7和節點3的最近公共祖先就是節點1)
  2. 分別求出兩個節點到最近公共祖先的路徑長度(節點7到節點1的長度爲3,節點3到節點1的長度爲1)
  3. 求出兩個節點的路徑長度(3+1=4)

代碼

package Tests;

import java.util.LinkedList;

/**
 * @author zj
 * @date 2020/5/12
 */

public class FindDistance {
    //共同祖先
    public TreeNode getPar(TreeNode root,TreeNode p,TreeNode q){
        if(root==null||root==p||root==q){
            return root;
        }
        TreeNode left = getPar(root.left,p,q);
        TreeNode right = getPar(root.right,p,q);
        if(left!=null&&right!=null){
            return root;
        }
        return left==null?right:left;
    }
    //到祖先的距離
    static boolean visited = false;
    public void getDisToPar(TreeNode root, TreeNode p, LinkedList<Integer> stack){
        if(root==null){
            return ;
        }
        //將節點添加到棧中
        stack.push(root.val);
        //如果找到了
        if(!visited&&root==p){
            visited  = true;
            return;
        }
        //先找左子樹
        if(!visited){
            getDisToPar(root.left,p,stack);
        }
        //左子樹沒找到再找右子樹
        if(!visited){
            getDisToPar(root.right,p,stack);
        }
        //如果還沒找到,說明不在這個節點下面,彈出來
        if(!visited){
            stack.pop();
        }
        return;
    }

    public static void main(String[] args) {

        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);
        TreeNode node7 = new TreeNode(7);
        TreeNode node8 = new TreeNode(8);

        node1.left = node2;
        node1.right = node3;
        node2.left = node4;
        node3.left = node5;
        node3.right = node6;
        node4.right = node7;
        node6.left = node8;

        FindDistance findDistance = new FindDistance();
        //找到最近公共祖先
        TreeNode par = findDistance.getPar(node1, node3, node7);
        //stack存路徑,存的就是路徑上的所有節點
        LinkedList<Integer> stack1 = new LinkedList<>();
        LinkedList<Integer> stack2 = new LinkedList<>();
        findDistance.getDisToPar(par,node3,stack1);
        //復位
        visited = false;
        findDistance.getDisToPar(par,node7,stack2);
        //-2是因爲每一個路徑長度等於 節點數-1
        System.out.println(stack1.size()+stack2.size()-2);
    }
}

參考鏈接:二叉樹中兩節點之間最短路徑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章