【LeetCode 劍指Offer】 二叉樹的最大與最小深度
阿新 • • 發佈:2018-11-10
求最大深度和最小深度。
最大深度
題目:
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
思路:
1,一個二叉樹的深度 = 以根節點為root的子樹的深度 = max ( 以root->left為root的子樹的深度, 以root->right為root的子樹的深度 ) + 1
2,如果一個節點為空,則該節點深度為0,或者說如果一個節點沒有左右子樹,則該節點深度為1
int TreeDepth(TreeNode* pRoot) { if(!pRoot) // 如果到達了空結點,則返回0深度 return 0; int left = TreeDepth(pRoot->left); int right = TreeDepth(pRoot->right); return max(left, right) + 1; }
最小深度
最小深度簡單思考可以認為是最大深度類似問題,即一個樹的最小深度等於左右子數的最小深度+1。
稍加修改:
int TreeDepth(TreeNode* pRoot) { if(!pRoot) // 如果到達了空結點,則返回0深度 return 0; int left = TreeDepth(pRoot->left); int right = TreeDepth(pRoot->right); return min(left, right) + 1; }
這麼做其實與題意不符。最小深度必須要到達一個葉結點,如果一個結點只有單側結點,上述方法會直接停止,得到錯誤的最小深度。見下圖:
故需要修改,增加判斷當前結點的左右結點是否為空:
(1)若有一個為空,則取另一側的最小長度+1(而不是之前那樣取為空位置的深度)
(2)當左右均不為空時再取兩者的最小深度。
int run(TreeNode *root) { if (!root) return 0; if (!root->left) return run(root->right)+1; if (!root->right) return run(root->left)+1; return min(run(root->left), run(root->right)) + 1; }