引言
在二叉樹的相關算法中,高度(Height)和深度(Depth)是兩個容易混淆的概念。本文通過示例和代碼實現,幫助讀者清晰區分二者的區別。
定義與區別
屬性 | 定義 | 計算方式 |
---|---|---|
深度 | 從根節點到該節點的邊數 | 根節點深度為0 |
高度 | 從該節點到最遠葉子節點的邊數 | 葉子節點高度為0 |
核心區別:
-
深度是自上而下從根節點到當前節點的路徑長度。
-
高度是自下而上從當前節點到最遠葉子節點的路徑長度。
-
樹的高度等于根節點的高度,也等于樹的最大深度。
示例與表格
以下圖二叉樹為例:
A/ \B C/ \D E
各節點的屬性如下表:
節點 | 深度 | 高度 |
---|---|---|
A | 0 | 2 |
B | 1 | 1 |
C | 1 | 1 |
D | 2 | 0 |
E | 2 | 0 |
C++實現
1. 樹節點定義
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
2. 計算高度(遞歸)
int height(TreeNode* root) {if (!root) return -1; // 空節點高度為-1return 1 + max(height(root->left), height(root->right));
}
3. 計算深度(遞歸搜索)
int depth(TreeNode* root, TreeNode* target) {if (!root) return -1; // 未找到目標if (root == target) return 0; // 找到目標,深度為0int left = depth(root->left, target);if (left != -1) return left + 1; // 左子樹中找到,深度+1int right = depth(root->right, target);return (right != -1) ? right + 1 : -1;
}
注意事項
-
定義差異:某些場景中,深度和高度的計算可能基于節點數而非邊數。例如:
-
根節點深度為1,葉子節點高度為1。
-
此時樹的高度等于最大深度,需調整代碼邏輯。
-
-
應用場景:
-
高度常用于平衡二叉樹判斷(如AVL樹)。
-
深度常用于路徑問題(如最大深度)。
-
總結
-
高度關注當前節點到葉子的最長路徑。
-
深度關注根節點到當前節點的路徑。
-
代碼實現需根據具體定義調整邊界條件。