代码随想录打卡第17天 513. 找树左下角的值 112. 路径总和 113. 路径总和 II

513. 找树左下角的值

题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/

算法思想:

求深度最深的那一层的最左边的节点。那只要找到深度最深的那一层,然后取得遍历到的第一个节点就行。

因此可以采用前序遍历。

代码

class Solution {

public:

    int final = INT_MIN;

    int final_deep = INT_MIN;

    void findbottom(TreeNode* node, int height)

    {

        if (node==NULL)

            return;

        if(node->left==NULL && node->right == NULL)

        {


            if(final_deep < height)

            {

              final = node->val;

              final_deep = height;

            }

        }

        findbottom(node->left, height+1);

        findbottom(node->right, height+1);

    }

    int findBottomLeftValue(TreeNode* root) {

        //使用前序遍历

        int height = 0;

        findbottom(root, height);

        return final;

    }

};

112. 路径总和

题目链接:

https://leetcode.cn/problems/path-sum/

算法思想:

前序遍历(其实没有前,因为没有对中节点做什么处理)

首先需要确定递归返回的条件:

遍历到叶子节点的时候判断是否满足条件,满足返回true,否则返回false

代码:

class Solution {

public:

    bool haspath(TreeNode* root, int target, int sum)

    {

        if(root==NULL)

            return false;

        if(root->left==NULL&&root->right==NULL && sum+root->val == target)

            return true;

        bool left = haspath(root->left, target, sum+root->val);

        if(left)

            return true;

        bool right = haspath(root->right, target, sum+root->val);

        if(right)

            return true;


        return false;

    }

    bool hasPathSum(TreeNode* root, int targetSum) {

        return haspath(root, targetSum, 0);

    }

};

113. 路径总和 II

题目链接:

https://leetcode.cn/problems/path-sum-ii/

算法思想:

使用回溯法解决:回溯法是在递归函数的下一行写的。注意回溯法,要有进有出。

加上了之后,要减回去。

class Solution {

public:

    void path(TreeNode* root, int targetSum, vector<vector<int>>& res, vector<int>& cur)

    {

        if(root==NULL)

            return ;

        cout<<"target:"<<targetSum<<endl;

        if(root->left==NULL&&root->right==NULL&&targetSum==root->val)

        {

            cur.push_back(root->val);

            res.push_back(cur);

            cur.pop_back();

            return;

        }

        if(root->left==NULL&&root->right==NULL&&targetSum==root->val)

        {

            return;

        }

        if(root->left)

        {

            cur.push_back(root->val);

            targetSum = targetSum-root->val;

            // cout<<"left-sum:"<<targetSum<<endl;

            path(root->left, targetSum, res, cur);

            targetSum = targetSum + root->val;

            cur.pop_back();

        }

        if(root->right)

        {

            cur.push_back(root->val);

            targetSum = targetSum-root->val;

            // cout<<"right-sum:"<<targetSum<<endl;

            path(root->right, targetSum, res, cur);

            targetSum = targetSum + root->val;

            cur.pop_back();

        }

        return;

    }

    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {

        vector<vector<int> > result;

        vector<int> cur;

        path(root, targetSum, result, cur);

        return result;


    }

};

106.从中序与后序遍历序列构造二叉树

题目链接:

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

算法思想:

根据后续遍历的结果确定根节点,根据根节点确定,从中序遍历中确定左右子树的切割点,从而确定左右子树的大小。再使用左子树的大小,去后续遍历中找到左右子树的切割点,进行递归。

/**

* Definition for a binary tree node.

* struct TreeNode {

*    int val;

*    TreeNode *left;

*    TreeNode *right;

*    TreeNode() : val(0), left(nullptr), right(nullptr) {}

*    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

*    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

* };

*/

class Solution {

public:

    TreeNode* buildtree(vector<int>& inorder, int in_start, int in_end, vector<int>& postorder, int post_start, int post_end)

    {

        // cout<<"in_start:"<<in_start<<" in_end:"<<in_end<<" post_start"<<post_start<<" post_end"<<post_end<<endl;

        if(post_end<post_start)

        { 

            // cout<<"in if: post_start"<<post_start<<" post_end"<<post_end<<endl;

            return NULL;

        }


        int now = postorder[post_end];

        // cout<<"now:"<<now<<endl;

        TreeNode* node = new TreeNode(now);

        if(in_end==in_start)

            return node;

        int i=in_start; //

        //根据后续遍历确定根节点的值,去中序遍历的数组中寻找左右子树的分割点

        for(i=in_start;i<=in_end;i++)

        {

            // cout<<"while i:"<<i<<endl;

            if(now == inorder[i]) //找到了中序遍历的分割点

            {

                break;

            }

        }

        // cout<<"i:"<<i<<endl;

        int left_size = i-in_start;


        node->left = buildtree(inorder, in_start,i-1,postorder,post_start,post_start+left_size-1);

        node->right = buildtree(inorder,i+1,in_end, postorder, post_start+left_size,post_end-1);

        // cout<<"node->val:"<<node->val<<endl;

        return node;



    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {

        return buildtree(inorder,0,inorder.size()-1, postorder,0,postorder.size()-1);

    }

};

105. 从前序与中序遍历序列构造二叉树

题目链接:

https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

算法思想:

根据前序遍历确定根节点,去中序遍历中寻找中序遍历的切割点,从而确定左右子树的条件。

要明确循环终止的条件:根节点为空或者走到叶子节点时。

/**

* Definition for a binary tree node.

* struct TreeNode {

*    int val;

*    TreeNode *left;

*    TreeNode *right;

*    TreeNode() : val(0), left(nullptr), right(nullptr) {}

*    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

*    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

* };

*/

class Solution {

public:

    TreeNode* buildtree(vector<int>& preorder, int pre_s, int pre_e, vector<int>& inorder, int in_s, int in_e)

    {

        if(pre_e<pre_s)

            return NULL;

        TreeNode* node = new TreeNode(preorder[pre_s]);

        if(pre_e==pre_s)

        {

            return node;

        }

        //根据中序遍历,确定开始和结束

        int i;

        for(i=in_s;i<in_e;i++) //找到了中序遍历的切割点

        {

            if(preorder[pre_s]==inorder[i])

                break;

        }

        //确定前序遍历的左叶子节点的结束为止

        int preorder_left_start = pre_s+1;

        int preorder_left_end = pre_s+(i-in_s);

        int preorder_right_start = pre_s+(i-in_s)+1;

        int preorder_right_end = pre_e;

        // 中序遍历的开始和结束

        int inorder_left_start = in_s;

        int inorder_left_end = i-1;

        int inorder_right_start = i+1;

        int inorder_right_end = in_e;

        node->left = buildtree(preorder, preorder_left_start,preorder_left_end, inorder,inorder_left_start,inorder_left_end);

        node->right = buildtree(preorder,preorder_right_start,preorder_right_end, inorder,inorder_right_start,inorder_right_end);

        return node;

    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {

        return buildtree(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);

    }

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容