当前位置 : 主页 > 编程语言 > c语言 >

算法练习-day14

来源:互联网 收集:自由互联 发布时间:2023-08-28
二叉树 110. 平衡二叉树 题意:给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过

二叉树

110. 平衡二叉树

题意:给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例:

算法练习-day14_二叉树

       思路:本题我们可以自下而上判断二叉树是否为平衡二叉树,以上图为示例,我们先判断15是不是平衡二叉树,很明显是的,此时就引出了我们递归的终止条件,当root为空时,此时返回0;再判断20节点,发现高度差为0,符合条件,此时的高度变为1+子二叉树的最大高度,此时为2,以此往上判断;而当高度差大于-1时,这时我们就会有新的判断条件,只要有一个子树为-1,那么之后的所有子树都为-1,这样我们在返回主函数判断时,判断的依据也自然就是返回的值是否等于-1

C++代码:

int intDepth(TreeNode* root)
    {
        if(nullptr==root)//当为空节点时,返回0(即叶子节点之后的节点没有高度)
        {
            return 0;
        }
        int leftHeigh=intDepth(root->left);
        if(leftHeigh==-1)//当有一个节点高度为-1时,就说明该二叉树已经不是平衡二叉树了,所以之后的节点都会继承-1,最后返回给根节点
        {
            return -1;
        }
        int rightHeigh=intDepth(root->right);
        if(rightHeigh==-1)
        {
            return -1;
        }
        int result=rightHeigh-leftHeigh;
        if(result<-1||result>1)//当两高度已经不满足条件时,直接返回-1
        {
            result =-1;
        }
        else//两高度差还满足条件,此时根节点高度为1+最大高度
        {
            result=max(leftHeigh,rightHeigh)+1;
        }
        return result;
    }
    bool isBalanced(TreeNode* root) {
        return intDepth(root)==-1?false:true;
    }

257. 二叉树的所有路径

题意:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。

示例:

算法练习-day14_平衡二叉树_02

       思路:本题的思路就是使用前序遍历和回溯的方法,先将我们看到的节点加入到给定的数组中,用于记录路径的节点,然后再通过返回条件,让数组中元素以->的方式加入arr中,最后在返回到上一步,找是否有不同路径需要保存

C++代码:

vector<string> arr;
    void Allpath(TreeNode* root,vector<int>& tmp)
    {
        tmp.push_back(root->val);//前序遍历写法
        if(nullptr==root->left&&nullptr==root->right)//走到一个路径的末尾了
        {
            string s;
            for(int i=0;i<tmp.size()-1;i++)//将前n-1个节点加入,中间需要到->符号
            {
                s+=to_string(tmp[i]);
                s+="->";
            }
            s+=to_string(tmp[tmp.size()-1]);//单独添加最后一个节点
            arr.push_back(s);
        }
        if(root->left)//模拟回溯函数,先增加节点,然后删除节点
        {
            Allpath(root->left,tmp);
        }
        if(root->right)
        {
            Allpath(root->right,tmp);
        }
        tmp.pop_back();
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> tmp;
        Allpath(root,tmp);
        return arr;
    }

404. 左叶子之和

题意:给定二叉树的根节点 root ,返回所有左叶子之和。

示例:

算法练习-day14_二叉树_03

       思路:本题我们需要考虑的是,什么是左叶子?即叶子节点的上一个节点的左孩子,就是左叶子。因此,我们需要使用中序便利的方法,找到左叶子,然后再根据左叶子的判断条件进行相加即可

C++代码:

int sum=0;
    void CountLeft(TreeNode* root)
    {
        if(root->left)//中序遍历写法,我们永远需要的都是左叶子节点,包括右子树,也是左叶子节点
        {
            CountLeft(root->left);
        }
        if(root->left!=nullptr&&root->left->left==nullptr&&root->left->right==nullptr)//判断是否为左叶子
        {
            sum+=root->left->val;
        }
        if(root->right)
        {
            CountLeft(root->right);
        }
    }
    int sumOfLeftLeaves(TreeNode* root) {
        CountLeft(root);
        return sum;
    }
上一篇:【数据结构】树的介绍
下一篇:没有了
网友评论