【题解】判断是不是完全二叉树、平衡二叉树

文章目录

  • 判断是不是完全二叉树
  • 判断是不是平衡二叉树

判断是不是完全二叉树

题目链接:判断是不是完全二叉树

解题思路:层次遍历

二叉树的一个很重要的特性:遍历到最后才会出现空节点,如果出现空节点后又出现节点,那说明该树不符合完全二叉树的要去

代码如下:

在这里插入代码片class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        bool flag = false;//前面是否有空节点出现
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            int n = q.size();
            for(int i=0; i<n; ++i){
                TreeNode* cur = q.front();
                q.pop();
                if(cur == nullptr){
                    flag = true;
                }else{
                    if(flag)  return false;//当前不为空的节点前面遇到了空节点,return false;
                    q.push(cur->left);//空节点也入队
                    q.push(cur->right);
                }
            }
        }
        return true;
    }
};

判断是不是平衡二叉树

题目链接:判断是不是平衡二叉树

解题思路:递归

对于平衡二叉树而言,左右子树的深度相差不超过1,所以,我们递归遍历每一棵子树,判断他们的深度是否满足要求

class Solution {
public:
//递归版本
    bool IsBalanced_Solution(TreeNode* pRoot) {
        if(pRoot == nullptr) return true;
        return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right) 
            && abs(deep(pRoot->left)- deep(pRoot->right))<2;
    }
    int deep(TreeNode* root){
        if(root == nullptr) return 0;
        return max(deep(root->left), deep(root->right))+1;
    }
};

解题思路2:回溯

自底向上传递深度,每次传递下一层是不是平衡二叉树以及深度

class Solution {
public:
//回溯版本
    //计算子树深度
    bool judge(TreeNode* root, int &depth){
        if(root == nullptr) {
            depth = 0;
            return true;
        }
        int l = 0, r = 0;
        if(judge(root->left, l) == false || judge(root->right, r) == false) 
            return false;
        if(abs(l-r) > 1) return false;
        depth = max(l, r) + 1;
        return true;
    }
    bool IsBalanced_Solution(TreeNode* pRoot) {
        int depth = 0;
        return judge(pRoot, depth);
    }
};

你可能感兴趣的:(题目练习,数据结构)