首页 > 编程语言 >剑指offer——Day15 搜索与回溯算法(中等)

剑指offer——Day15 搜索与回溯算法(中等)

时间:2022-11-26 22:36:47浏览次数:61  
标签:return target recur offer Day15 vector vec 回溯 root

Day15 2022.11.21 搜索与回溯算法(中等)

34.二叉树中和为某一值的路径

自己实现

用递归。递归函数的思路:

  • 首先是递归出口root==NULL时返回-1,告诉上层节点这个地方是NULL,以便于确认上层节点是否为叶子节点。
  • 然后将该点放进路径vector中
  • 然后向左向右调用recur,得到相应的返回结果(即判断左右儿子是否为NULL)。
  • 如果该节点为叶子节点(左右儿子都是NULL),则判断这条路径的总和是否与target相符,如果相符就将路径vector放进总的vectorres

代码如下:

class Solution {
	vector<vector<int>> res;
public:
	vector<vector<int>> pathSum(TreeNode* root, int target) {
		if (root == NULL)return res;
		vector<int> vec;
		recur(vec, root, target, 0);
		return res;
	}
	int recur(vector<int> vec, TreeNode* root, int target, int before)
	{
		if (root == NULL)return 1;
		vec.push_back(root->val);
        int left=recur(vec, root->left, target, before + root->val);
        int right=recur(vec, root->right, target, before + root->val);
		if (left&&right)
		{
			if (before + root->val == target)
			{
				res.push_back(vec);
				return 0;
			}
		}
		/*else
		{
			recur(vec,root->left,target,before+root->val);
			recur(vec,root->right,target,before+root->val);
		}*/
		return 0;
	}
};

代码表现

题解

与自己实现的思路大致一样,有细微的改变在于将路径vector作为全局变量而非局部变量,同时减少了向recur()的参数传递,可能vector容器参数的传递会让时间大幅度增长

class Solution {
    vector<vector<int>> res;
    vector<int> path;
public:
    vector<vector<int>> pathSum(TreeNode* root, int target) {
        recur(root, target);
        return res;
    }
    void recur(TreeNode *root, int tar) {
        if(root == NULL) return;
        path.push_back(root->val);
        tar -= root->val;
        if(tar == 0 && root->left == NULL && root->right == NULL)
            res.push_back(path);
        recur(root->left, tar);
        recur(root->right, tar);
        path.pop_back();
    }
};

代码表现

hint:

  • 注意把一些函数或者赋值写在if判断里面,特别是有&&的时候,可能会因为判断短路导致后面的判断中的语句没有被运行

36.二叉搜索树与双向链表

自己实现

因为不知道二叉搜索树的这个性质(二叉搜索树按中序遍历是递增的),导致没有思路,直接看题解了

题解

因为二叉搜索树的中序遍历是递增的,所以这个地方可以利用这个性质来构建序列。

具体实现没有很懂,可以看看这个链接来结合理解

代码如下:

class Solution {
public:
    Node* treeToDoublyList(Node* root) {
        if(root == nullptr) return nullptr;
        dfs(root);
        head->left = pre;
        pre->right = head;
        return head;
    }
private:
    Node *pre, *head;
    void dfs(Node* cur) {
        if(cur == nullptr) return;
        dfs(cur->left);
        if(pre != nullptr) pre->right = cur;
        else head = cur;
        cur->left = pre;
        pre = cur;
        dfs(cur->right);
    }
};

代码表现

hint

  • 二叉搜索树的中序遍历序列是所有节点值的递增序列
  • 学习中序遍历的递归函数写法

54.二叉搜索树的第k大节点

自己实现

就是上一个题的迷你版,主要是考察二叉搜索树的中序遍历性质,然后考察中序遍历的编写方法

代码如下:

class Solution {
    vector<int> vec;
public:
    int kthLargest(TreeNode* root, int k) {
        dfs(root);
        return vec[vec.size()-k];
    }
    void dfs(TreeNode* root)
    {
        if(root==NULL)return;
        dfs(root->left);
        if(root!=NULL)vec.push_back(root->val);
        dfs(root->right);
        return;
    }
};

代码表现

标签:return,target,recur,offer,Day15,vector,vec,回溯,root
From: https://www.cnblogs.com/cspzyy/p/16928493.html

相关文章

  • 剑指offer——Day16 排序(简单)
    Day162022.11.22排序(简单)45.把数组排成最小的数自己实现没有思路题解也是比较大小,只是这个比较大小的方法是两个数字字符串stringx和stringy,如果x+y<y+x,说明x应该......
  • 回溯算法
    算法思想回溯实际上是一种试探算法,这种算法跟暴力搜索最大的不同在于,在回溯算法里,是一步一步地小心翼翼地进行向前试探,会对每一步探测到的情况进行评估,如果当前的情况已经......
  • 麻了,三个offer不知道选哪个?
    果然鲁迅先生说的不错,人与人之间的悲欢并不相通有的小伙伴苦于没有面试,有的小伙伴却苦于offer太多不知道选择哪个?一、拿到的offer阿里:阿里云数据库方向,地址北京/杭州,年薪50......
  • 代码随想录算法训练营Day08|344. 反转字符串、541. 反转字符串 II、剑指 Offer 05. 替
    代码随想录算法训练营Day08|344.反转字符串、541.反转字符串II、剑指Offer05.替换空格、151.反转字符串中的单词、剑指Offer58-II.左旋转字符串344.反转字符......
  • P1644 跳马问题 C++ 搜索回溯+dfs
    题目背景在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……题目描述中国象棋半张棋盘如图1所示。马自左下角(0,0)向右上角(m,n)跳。规定只能往......
  • P1002 过河卒 详细题解 搜索回溯+递归 [NOIP2002 普及组]
    题目描述棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方......
  • 剑指 Offer 39. 数组中出现次数超过一半的数字(摩尔投票法)
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1:输入:[1,2,3,2,2,2,5,......
  • 剑指offer——Day12 双指针(简单)
    Day122022.11.18双指针(简单)25.合并两个排序的链表自己实现就用两个指针分开指向两个链表并进行遍历,比较之后放入新的列表里。代码如下:classSolution{public:......
  • 剑指offer——Day13 双指针(简单)
    Day132022.11.19双指针(简单)21.调整数组顺序使奇数位于偶数前面自己实现初步想法是一个指针从开头向右移动,移动到偶数停止;另一个指针从数组中间位置向右移动,移动到奇......
  • 剑指offer——Day11 2022.11.17 双指针(简单)
    Day112022.11.17双指针(简单)18.删除链表的节点自己实现直接遍历就行了代码如下:classSolution{public:ListNode*deleteNode(ListNode*head,intval){......