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

被折叠的 条评论
为什么被折叠?



