1. 程式人生 > >Java 實現二叉樹的深度

Java 實現二叉樹的深度

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

程式碼

解法一

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    /**
     * 遞迴求深度
     * @param root
     * @return
     */
    public static int treeDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        // 計算左子樹的深度
        int left = treeDepth(root.left);
        // 計算右子樹的深度
        int right = treeDepth(root.right);
        // 樹root的深度=路徑最長的子樹深度 + 1
        return left >= right ? (left + 1) : (right + 1);
    }

解法二

    /**
     * 非遞迴,藉助棧來計算深度(層數)
     * 比如                root,先放入棧中
     *         5          當前棧的元素數量為1,len=1,取出棧中此時所有的元素,即5,然後將其子節點3和7放入棧中
     *     3       7      當前棧的元素數量為2,len=2,所以連續從棧中pop兩次,使棧中不在含有該層元素,同時將下層節點2和4放入棧中
     * 2       4          當前棧的元素數量為2,len=2,所以連續從棧中pop兩次
     *                    記錄深度,所以每次pop出棧中所有元素(某層的所有節點)只需深度+1,即depth++
     * @param root
     * @return
     */
    public static int treeDepth2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        // 初始化深度
        int depth =  0;
        // 存放每層樹節點的棧
        Stack<TreeNode> stack = new Stack<>();
        // 將樹的根(即第一層)放入棧中
        stack.push(root);
        while (!stack.isEmpty()) {
            // 當棧不為空時,層數+1,
            // 因為每次都會pop出當前層的所有節點,並將該層所有節點的子節點放入棧中
            depth++;
            // 當前棧中元素的數量
            int length = stack.size();
            while (length-- > 0) {
                // 取出棧中所有的節點,並將對應節點的子節點放入棧中
                TreeNode node = stack.pop();
                if (node.left != null) {
                    stack.push(node.left);
                }
                if (node.right != null) {
                    stack.push(node.right);
                }
            }
        }
        return depth;
    }