1. 程式人生 > 實用技巧 >判斷一棵二叉樹是否為平衡二叉樹

判斷一棵二叉樹是否為平衡二叉樹

平衡二叉樹每一個節點的平衡因子都小於等於1,所以我們判斷每一個節點左右子樹的深度查是不是小於等於1即可

我們可以從上往下開始判斷每一個節點的平衡因子(兩個遞迴,一個求深度,另一個遞迴樹)

也可以從葉子節點往上遞迴,把每個節點的深度儲存再節點中,判斷平衡 因子(下面程式碼就是使用這種方法)

#include <iostream>
#include <vector>
#include <algorithm>
#include<stack>
#include<math.h>
#include<string>
#include
<string.h> #include<map> using namespace std; // Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: //從葉子節點開始往上判斷每一個節點的平衡因子 bool isBalanced(TreeNode* root) {
if (root == nullptr) { return true; } else { if (isBalanced(root->left) && isBalanced(root->right)) { int left = 0; if (root->left == nullptr) { left = -1; }
else { left = root->left->val; } int right = 0; if (root->right == nullptr) { right = -1; } else { right = root->right->val; } if (abs(left - right) < 2) { root->val = left > right ? left + 1 : right + 1;//取較深的值 return true; } else { return false; } } else { return false; } } } }; TreeNode* insert(TreeNode* root, int x) { if (root == NULL) { TreeNode* temp = new TreeNode(0); temp->val = x; temp->left = NULL; temp->right = NULL; return temp; } if(x<root->val) root->left = insert(root->left, x); else root->right = insert(root->right, x); return root; } void Print(TreeNode* root) { if (root == NULL) return; Print(root->left); Print(root->right); cout << root->val << endl; } int main() { TreeNode* root = NULL; int n, x; cin >> n; for (int i = 0; i < n; i++) { cin >> x; root = insert(root, x); } Solution A; cout << A.isBalanced(root) << endl; Print(root); return 0; }