面試題55_2:平衡二叉樹
阿新 • • 發佈:2020-08-24
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
在這裡,我們只需要考慮其平衡性,不需要考慮其是不是排序二叉樹
解題思路
- 根據上一個題目“求二叉樹的深度”,遍歷每一個節點的左右子樹深度
- 通過“後序遍歷”的特點,每個節點只需要遍歷一次
上程式碼(C++很香)
法一:根據上一個題目“求二叉樹的深度”,遍歷每一個節點的左右子樹深度(每個節點可能會被遍歷多次)
int maxD = 0; void dfs(TreeNode* pNode, int depth){ // 葉子節點 if(pNode->left == nullptr && pNode->right == nullptr){ if(depth > maxD) maxD = depth; return ; } if(pNode->left != nullptr) dfs(pNode->left, depth + 1); if(pNode->right != nullptr) dfs(pNode->right, depth + 1); } int TreeDepth(TreeNode* pRoot){ if(pRoot == nullptr) return 0; dfs(pRoot, 1); return maxD; } bool IsBalanced_Solution(TreeNode* pRoot){ if(pRoot == nullptr) return true; int left = TreeDepth(pRoot->left); maxD= 0; int right = TreeDepth(pRoot->right); maxD = 0; int diff = abs(left - right); if(diff > 1) return false; return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right); }
法二:通過“後序遍歷”的特點,每個節點只需要遍歷一次
bool IsBalanced(TreeNode* pRoot, int* pDepth){ if(pRoot == nullptr){ *pDepth = 0; return true; } // 妙啊 int left, right; if(IsBalanced(pRoot->left, &left) && IsBalanced(pRoot->right, &right)){ int diff = left - right; if(diff <= 1 && diff >= -1) { *pDepth = 1 + (left > right ? left : right); return true; } } return false; } bool IsBalanced_Solution(TreeNode* pRoot){ int depth = 0; return IsBalanced(pRoot, &depth); }