剑指Offer刷题记录 Day_15

本文探讨了二叉树的遍历在解决特定问题中的应用,如找到和为目标值的路径、将二叉搜索树转换为双向循环链表以及找到二叉搜索树中的第k大节点。通过深度优先搜索(DFS)和中序遍历策略,展示了如何有效地遍历和操作树结构。

回溯与搜索(中等)

Q 1 二叉树中和为某一值的路径

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

解题思路:

  • 先序遍历:按照先序遍历顺序搜索某二叉树时,根节点到某一叶节点的路径就在遍历数列中。
  • DFS:深度优先搜索,搜索到叶结点时,若路径总和等于目标值,记录该路径;否则回溯,搜索其他可能路径
/**
 * 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:
    vector<vector<int>> Sum;
    vector<int> path;

    void dfs(TreeNode* root, int targetSum) {         
        if (root == nullptr) {
            return;
        }
        path.emplace_back(root->val);   

        targetSum -= root->val;
        if (root->left == nullptr && root->right == nullptr && targetSum == 0) {
            Sum.emplace_back(path);
        }
        dfs(root->left, targetSum);      
        dfs(root->right, targetSum);

        path.pop_back();           
    }

    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        dfs(root, targetSum);
        return Sum;
    }

};

Q2 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

解题思路:

  • 二叉搜索树,排序,首先想到中序遍历,中序遍历会得到一个有序遍历序列。

  • 在遍历时,要进行结点的重构,因此需要一个遍历记录前驱(pre),而后继则可以通过中序遍历得知,因此需要额外的指针pre记录每一个结点的上一个结点 。

  • 最后要将第一个结点和最后一个结点相互连接。

class Solution {

public:
     Node *head, *pre;
     Node * treeToDoublyList(Node* root) {
        if(root==nullptr) return nullptr;
        
        dfs(root);

        pre->right = head;
        head->left =pre;

        return head;

    }

    void dfs(Node *root){
        
        if(root==nullptr) return;
        dfs(root->left);

        if(pre==nullptr) head = root;
        else {
            pre->right = root;
            root->left = pre;
        }
        pre = root;
        dfs(root->right);
    }
};

Q3 二叉搜索树的第k大节点

本题主要还是考察二叉搜索树的遍历,只要按照右根左的顺序遍历,既可以满足题意。

class Solution {
public:
    int n,res;
    int kthLargest(TreeNode* root, int k) {
        
        n = k;
        DFS(root);
        return res;
        
    }
    void DFS(TreeNode* root)
    {
        if(!root) return ;
        DFS(root->right);
        n--;
        if(!n)  res = root->val;        
        DFS(root->left);

    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值