代码随想录第十五天二叉树part03

第一题 二叉树的最大深度

用了递归和迭代两种方法都写出来了。

递归:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == nullptr) return 0;
        int leftindex = maxDepth(root->left);
        int rightindex = maxDepth(root->right);
        int depath = max(leftindex,rightindex) + 1;
        return depath;
    }
};

迭代: 

class Solution {
public:
    int maxDepth(TreeNode* root) {
        queue que;
        if(root == nullptr) return 0;
        que.push(root);
        int depth = 0;
        while(!que.empty()){
            int size = que.size();
            depth++;
            for(int i = 0 ;i < size;i++){
                TreeNode* cur = que.front(); que.pop();
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
        }
        return depth;
    }
};

n叉树的方法也差不多,只是递归的时候需要用for来对所有子节点深度进行递归,

class Solution {
public:
    int maxDepth(Node* root) {
        if(root == nullptr) return 0;
        int result = 0;
        for(auto & ch :root->children){
            int depth =maxDepth(ch);
            result = max(result,depth);
        }
        return result + 1;
    }
};

第二题 二叉树的最小深度

注意判断条件是左右节点都为null才是叶子节点,如果左边为空就计算右边的叶子节点的最小深度然后加上根节点的高度1返回。

递归:

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(root == nullptr) return 0;
        int leftindex =minDepth(root->left);
        int rightindex =minDepth(root->right);
        if(!root->left && root->right) return rightindex + 1;
        if(root->left && !root->right) return leftindex + 1;
        int Depth = min(leftindex,rightindex) + 1;
        return Depth;
    }
};

如果是用迭代条件只有在size后面加一个计数器depth就行,当出现left和right都不存在的节点就直接返回depth。

class Solution {
public:
    int minDepth(TreeNode* root) {
        queue que;
        int depth = 0;
        if(root == nullptr) return depth;
        que.push(root);
        while(!que.empty()){
            int size = que.size();
            depth++;
            for(int i = 0;i < size;i++){
                TreeNode* cur = que.front();
                que.pop();
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
                if(cur->left ==nullptr && cur->right == nullptr) return depth;
            }

        }
        return depth;
    }
};

第三题完全二叉树的节点个数

用递归和迭代法都写出来了。

递归:

class Solution {
public:
    int getnum(TreeNode *root){
        if(root == nullptr) return 0;
        int leftindex = getnum(root->left);
        int rightindex = getnum(root->right);
        return leftindex+ rightindex +1;
    }
    int countNodes(TreeNode* root) {
        
      return getnum(root);
    }
};

迭代:

class Solution {
public:
    int countNodes(TreeNode* root) {
        queue que;
        if(root == nullptr) return 0;
        que.push(root);
        int sum = 0;
        while(!que.empty()){
            int size = que.size();
            sum += size;
            for(int i = 0 ;i < size;i++){
            TreeNode *cur = que.front(); que.pop();
            if(cur->left) que.push(cur->left);
            if(cur->right) que.push(cur->right);
            }
        }
        return sum ;
    }
};

你可能感兴趣的:(数据结构,算法)