二叉树零散

110.平衡二叉树
平衡二叉树的概念:左右子树的高度差不超过1,左右子树分别满足这个条件
使用递归三部曲
1.明确递归函数的参数和返回值,这里是节点,返回值是深度;
2.确定终止条件,当节点为空时,返回0(深度为0);
3.确定运行逻辑,左子树、右子树若不满足平衡二叉树的条件,那么返回-1标记值,若左子树右子树的高度大小差值超过1,那么也返回-1标记不是平衡二叉树;
根据模板可得出:

class Solution {
public:
    int IsBalanced(TreeNode* root){
        if(root==nullptr) return 0;

        int left=IsBalanced(root->left);
        int right=IsBalanced(root->right);

        if(left==-1||right==-1) return -1;
        if(abs(left-right)>1) return -1;

        return max(left,right)+1;
    }
    bool isBalanced(TreeNode* root) {
        if(IsBalanced(root)==-1) return false;
        else return true;
    }
};

这题用迭代法做有很多重复计算;个人觉得应该不会考察这么细;

257.二叉树的所有路径
做递归方法的时候,有点搞蒙了,主要是怎么集成一个string,没想好怎么加”->“ 这个符号,注意我开始做的时候,确定终止条件是节点为空的时候,但是这个时候返回的值是双份的,意思是叶子节点处保留了两份记录,同时如果左子树为空或者右子树为空的时候都会造成一份记录,这个时候怎么办,只能改成是遇到叶子节点的时候,终止,加节点到string上;
1.确定参数与返回值,我使用引用传递,在函数中不断加入string,不用返回值,因此参数需要节点,保存结果的vector -string,以及保留路径的string temp;

class Solution {
public:
    void preOrder(TreeNode* root,vector<string>& res,string temp) {
        if(root->left==nullptr&&root->right==nullptr) {
            temp=temp+"->";
            char c=root->val+'0';
            temp=temp+c;
            res.emplace_back(temp);
            return ;
        }
        if(root->left){
            string s=temp;
            s=s+"->";
            char m=(root->val+'0');
            s=s+m;
            preOrder(root->left,res,s);
        }
        if(root->right){
            string s=temp;
            s=s+"->";
            char m=(root->val+'0');
            s=s+m;
            preOrder(root->right,res,s);
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> res;
        preOrder(root->left,res,"");
        preOrder(root->right,res,"");
        for(auto &e:res) {
            char a=root->val+'0';
            e=a+e;
        }
        return res;
    }
};

404.左叶子之和
判断底层在于左叶子,但是迭代过程是不知道自己是不是左叶子的,所以需要在左叶子的父节点来判断,按照这个理解,我认为怎么遍历都可以的,统一格式遍历的后序遍历:

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root==nullptr) return 0;
        stack<TreeNode*> q;
        q.push(root);
        int sum=0;
        while(!q.empty()) {
            TreeNode* node=q.top();
            if(node!=nullptr) {
                q.push(nullptr);
                if(node->right) {
                    q.push(node->right);
                }
                if(node->left) {
                    q.push(node->left);
                }
            }else{  
                q.pop();
                TreeNode* w=q.top();
                if(w->left!=nullptr&&w->left->left==nullptr&&w->left->right==nullptr) {
                    sum+=w->left->val;
                }
                q.pop();
            }
        }
        return sum; 
    }

按照递归的话:
第一步,判断递归函数的参数和返回值,只要节点,返回值为返回的int值
第二步,判断终止条件,当节点为空的时候,肯定返回0;
第三步,确定单层逻辑,求的是左子树下左叶子的总和,加上右子树下右叶子的;

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root==nullptr) return 0;
        
        int leftValue=sumOfLeftLeaves(root->left);
        if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr) {
            leftValue+=root->left->val;
        }
        int rightValue=sumOfLeftLeaves(root->right);
        return leftValue+rightValue;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值