Day18 | 513. 找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树

513.找树左下角的值

用层序遍历,找最后一层最左边的值(也就是每次入队的第一个元素),就可以找到树左下角的值

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*> q;
        q.push(root);
        int res=0;
        while (!q.empty()){
            int size=q.size();

            for (int i = 0; i < size; ++i) {
                TreeNode*p=q.front();
                q.pop();
                if(p->left)q.push(p->left);
                if(p->right)q.push(p->right);
                if(i==0)res=p->val;
            }

        }
        return res;
    }
};

112.路径总和

257.二叉树的所有路径思路相同,用后序遍历把左右孩子的情况返回给根节点,每次递归完后(把个结点的值加入这条路径中)需要回溯(再把这个结点的值从路径中减去,返回上一个结点)

class Solution {
public:
    void findPath(TreeNode*node,int &sum,vector<int>& res){
        sum+=node->val;//终止条件写在这,保证叶子结点的值也已加入路径中
        if(node->left==nullptr&&node->right== nullptr) {//叶子
            res.push_back(sum);
            return;
        }
        if(node->left){
            findPath(node->left,sum,res);
            sum-=node->left->val;
        }
        if(node->right){
            findPath(node->right,sum,res);
            sum-=node->right->val;
        }
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root== nullptr)return 0;
        int sum=0;
        vector<int> res;//记录所有路径的数值和
        findPath(root,sum,res);
        for (int i = 0; i < res.size(); ++i) {
            if(res[i]==targetSum)return 1;
        }
        return 0;
    }
};

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

重构二叉树需要先找到根结点,再找左右子树,后序遍历的根节点是最后一个值,再从中序遍历里找到根结点对应的值来切分左子树和右子树
在这里插入图片描述
上图为先序和中序,后序和中序同理

class Solution {
public:
    int find(vector<int>& inorder,int val){
    //find函数用来找中序序列里根结点的位置
        for (int i = 0; i < inorder.size(); ++i) {
            if(inorder[i]==val)return i;
        }
        return -1;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int n=inorder.size();
        if(n<=0)return nullptr;
        TreeNode*root=new TreeNode();
        root->val=postorder[n-1];
        int k= find(inorder,root->val);
        vector<int> leftInorder(inorder.begin(),inorder.begin()+k);
        vector<int> leftPostOrder(postorder.begin(),postorder.begin()+k);
        root->left= buildTree(leftInorder,leftPostOrder);
        vector<int> rightInorder(inorder.begin()+k+1,inorder.end());
        vector<int> rightPostOrder(postorder.begin()+k,postorder.begin()+n-1);
        root->right= buildTree(rightInorder,rightPostOrder);
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值