• 判断一棵二叉树是否为平衡二叉树


    平衡二叉树每一个节点的平衡因子都小于等于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;
    }
  • 相关阅读:
    POJ1028 Web Navigation【堆栈+模拟】
    UVa10276 HDU1329 ZOJ1239 Hanoi Tower Troubles Again!【递推函数+打表】
    UVALive5369 UVa732 HDU1515 ZOJ1004 Anagrams by Stack【DFS+堆栈】
    HDU5776 sum【前缀和+模除】
    POJ1844 Sum【水题+数学题】
    AOJ0558 Cheese【BFS】
    POJ3009 Curling 2.0【DFS】
    HDU1163 Eddy's digital Roots(解法二)【快速模幂+九余数定理】
    HDU1210 Eddy's 洗牌问题【递推函数+模拟】
    Vijos P1571 笨笨的导弹攻击【最长上升子序列+DP】
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13436054.html
Copyright © 2020-2023  润新知