題目
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
思路
如果一棵樹只有一個結點,它的深度為1,如果根節點只有左子樹而沒有右子樹,那么樹的深度應該是其左子樹的深度+1.同樣如果根節點只有右子樹而沒有左子樹,那么樹的深度應該是其右子樹+1.如果既有左子樹又有右子樹,那概述的深度就是左、右子樹的深度的較大值加1。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: int TreeDepth(TreeNode* root) { if(!root) return 0; int leftDepth=TreeDepth(root->left); int rightDepth=TreeDepth(root->right); return max(leftDepth,rightDepth)+1; } };
題目
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
思路
如果像去求二叉樹的深度那樣,先判斷根節點是不是平衡的,在判斷根的左右子樹是不是平衡的,這樣的話,會重復遍歷很多節點(根的左右子樹的子樹),所以可以用后序遍歷,遍歷到根結點之前已經先遍歷了左右子樹,只需要在便利每個結點的時候記錄它的深度,就可以一遍遍歷一邊判斷每個節點是不是平衡的。
class Solution { public: bool IsBalanced_Solution(TreeNode* root) { if(!root) return true; return IsBalanced_Solution_Core(root,0); } private: bool IsBalanced_Solution_Core(TreeNode *root,int n) { if(!root) { n=0; return true; } int left=0,right=0; if(IsBalanced_Solution_Core(root->left,left)&&IsBalanced_Solution_Core(root->right,right)) { int diff=left-right; if(abs(diff)<=1) { n=max(left,right)+1; return true; } } return false; } };