代码随想录2.6

文章目录

    • 112. 路径总和
    • 106. 从中序和后序遍历构造二叉树
    • 105.从前序与中序遍历序列构造二叉树
    • 654.最大二叉树
    • 617.合并二叉树

112. 路径总和

思路:

  1. 定义一个递归函数,用于反馈将结果(bool类型)
  2. 递归终止条件是当前节点的左右节点都为空
  3. 左节点递归
  4. 右节点递归(用的是前序)
/**
 * 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:
    bool traversal(TreeNode* cur, int cnt){
        if(!cur->left&&!cur->right&&cnt==0) return true;
        if(!cur->left&&!cur->right) return false;
        if(cur->left){
            cnt-=cur->left->val;
            if(traversal(cur->left, cnt)) return true;
            cnt+=cur->left->val;
        }
        if(cur->right){
            cnt-=cur->right->val;
            if(traversal(cur->right, cnt)) return true;
            cnt+=cur->right->val;
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if (root == NULL) return false;
        return traversal(root, targetSum-root->val);//注意减去root->val
    }
};

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

已知中序遍历结果和后序遍历将结果,构造出二叉树
后序遍历的最后一个数一定是节点
中序数组大小一定是和后序数组的大小相同。中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。

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

和上题思路一样,都是递归
前序和后序不能唯一确定一棵二叉树!,因为没有中序遍历无法确定左右部分,也就是无法分割。

654.最大二叉树

也是迭代,用数组index优化代码

617.合并二叉树

代码模板就是遍历二叉树递归

你可能感兴趣的:(代码随想录跟练记录,算法,c++,力扣,数据结构,开发语言)