Java 實現二叉樹的深度
阿新 • • 發佈:2019-01-22
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
程式碼
解法一
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; }