1. 程式人生 > >leedcode經典題目:二叉樹的直徑

leedcode經典題目:二叉樹的直徑

今天溫習了過去解決的一些題目,發現關於二叉樹的問題還是蠻有意思的,因為它們有著很多的共同點,而且多是通過遞迴思維解決,因此也有助於我們的邏輯能力的提升,下面給大家分享兩道比較類似的二叉樹問題~ 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例:給定二叉樹 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回它的最大深度 3 。 這裡我分別給出了遞迴和迭代兩種求解方式:

package com.gaoxue.LeetCode;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉樹的最大深度
 * @author Administrator
 *
 */
public class MaximumDepthBinaryTree {

        //遞迴方式
	public int maxDepth(TreeNode root) {
            return root == null ? 0 : (1 + Math.max(maxDepth(root.left), maxDepth(root.right)));
        }
        //迭代方式(堆疊) 
        public int maxDepth2(TreeNode root) {
        if (root == null) return 0;
        int res = 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while (!q.isEmpty()) {
            ++res;
            int n = q.size();
            for (int i = 0; i < n; ++i) {
                TreeNode t = q.poll();
                if (t.left != null) q.offer(t.left);
                if (t.right != null) q.offer(t.right);
            }
        }
        return res;
        }
	public static void main(String[] args) {
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		root.left.left = new TreeNode(4);
		root.left.right = new TreeNode(5);
		System.out.println(new MaximumDepthBinaryTree().maxDepth(root));
	}
}
   給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。       示例 :給定二叉樹          1
     / \
    2   3
   / \     
  4   5    
   返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。       注意:兩結點之間的路徑長度是以它們之間邊的數目表示。       這裡我給出了遞迴求解方式,當然也通過迭代方式搞定,大家可以加以思考自行實現:
package com.gaoxue.LeetCode;
/**
 * 遞迴求解二叉樹直徑
 * @author Administrator
 *
 */
public class DiameterBinaryTree {

    int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        maxDepth(root);
        return max;
    }
    private int maxDepth(TreeNode root) {
        if (root == null) return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        max = Math.max(max, left + right);
        return Math.max(left, right) + 1;
    }
	public static void main(String[] args) {
		TreeNode root = new TreeNode(1);
		root.left = new TreeNode(2);
		root.right = new TreeNode(3);
		root.left.left = new TreeNode(4);
		root.left.right = new TreeNode(5);
		System.out.println(new DiameterBinaryTree().diameterOfBinaryTree(root));
	}
}
   自己覺著這兩道題的實現區別主要就是遞迴方法引數的不同,前者以左右節點為引數比較左右部分,後者則把根節點作為引數比較全域性,當我們理清共同資訊要素後題目自然就迎刃而解啦,所以還是戒驕戒躁、砥礪前行哈~