代码随想录day15 二叉树3

题目:110.平衡二叉树 (优先掌握递归)257. 二叉树的所有路径 (优先掌握递归)  

404.左叶子之和 (优先掌握递归)     222.完全二叉树的节点个数(优先掌握递归)

需要重做:全部

110.平衡二叉树 (优先掌握递归)

思路:getHeight函数,如果不平衡,返回-1,否则返回当前左右子树最大值+1;

注意:此题需if(cur==null)就返回,因为不一定是叶子!可能1的左子树不为空,右子树为空,这样就遍历不了右子树

代码:

class Solution {
public:
    int getHeight(TreeNode*cur){
        if(cur==nullptr)return 0;
        int leftHeight=getHeight(cur->left);
        int rightHeight=getHeight(cur->right);
        if(leftHeight==-1)return -1;
        if(rightHeight==-1)return -1;
        return abs(leftHeight-rightHeight)>1? -1:1+max(leftHeight,rightHeight);
    }
    bool isBalanced(TreeNode* root) {
        int i=getHeight(root);
        return i==-1?false:true;
    }
};

257. 二叉树的所有路径 (优先掌握递归)

思路:从上到下,所以选择前序。因为到叶子节点,所以终止条件是到叶子节点。

加入path的操作,在是叶子节点,左右节点不为空的时候,都要加入,所以索性写在开头。

注意:

代码:

class Solution {
public:
    void traversal(TreeNode*cur,vector&path,vector&res){
        path.push_back(cur->val);//因为叶子节点也要加到路径里面,所以三个情况都要加,不如直接写在这了
        if(cur->left==nullptr&&cur->right==nullptr){//停止条件,到叶子节点停止
            string s;
            for(int i=0;ileft){
            traversal(cur->left,path,res);
            path.pop_back();
        }
        if(cur->right){
            traversal(cur->right,path,res);
            path.pop_back();
        }
    }
    vector binaryTreePaths(TreeNode* root) {
        vector a;
        vectorb;
        if(root==nullptr)return a;
        traversal(root,b,a);
        return a;
    }
};

404.左叶子之和 (优先掌握递归)

思路:后序(左右中)因为需要返回左右的加和

终止条件:cur==nullptr

参数和类型:返回int,参数仅需节点

单层递归逻辑:

左:先int值,如果是左叶子,就把值设为这个

右:int值。

中:return 两个的加和。

注意:

代码:

class Solution {
public:
    int getLeftSum(TreeNode*cur){
        if(cur==nullptr)return 0;    //本行及下行为终止条件
        if(cur->left==nullptr&&cur->right==nullptr)return 0;  
        int leftval=getLeftSum(cur->left);//左
        if(cur->left!=nullptr&&cur->left->left==nullptr&&cur->left->right==nullptr){
            leftval=cur->left->val;
        }
        int rightval=getLeftSum(cur->right);
        int sum=leftval+rightval;
        return sum;
    }
    int sumOfLeftLeaves(TreeNode* root) {
        int sum=getLeftSum(root);
        return sum;
    }
};

222.完全二叉树的节点个数(优先掌握递归)

思路:二刷的时候做一下按照完全二叉树的定义去做的。

参数,类型:只需要节点,返回int(累加)

终止条件:cur-》==nullptr

单层逻辑:

int 左num, int 右num,return 左+右+1;

注意:

代码:

class Solution {
public:
    int getNum(TreeNode*cur){
        if(cur==nullptr)return 0;
        int leftNum=getNum(cur->left);
        int rightNum=getNum(cur->right);
        return leftNum+rightNum+1;
    }
    int countNodes(TreeNode* root) {
        return getNum(root);
    }
};

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