二叉树中和为某一值的路径
与题目路径总和基本类似
中左右,前序遍历
class Solution {
public:
void traversal(TreeNode* node,vector<vector<int>>& result,vector<int>& path,int targetSum){
//中
path.push_back(node->val);
//叶子节点的情况
if(node->left==NULL&&node->right==NULL)
{
int sum=accumulate(path.begin(),path.end(),0);
if(sum==targetSum) result.push_back(path);
}
if(node->left)//左
{
traversal(node->left,result,path,targetSum);
path.pop_back();//回溯
}
if(node->right)
{
traversal(node->right,result,path,targetSum);
path.pop_back();//回溯
}
}
vector<vector<int>> pathSum(TreeNode* root, int target) {
vector<vector<int>> result;
vector<int> path;
if(root==NULL) return {};
traversal(root,result,path,target);
return result;
}
};
2.二叉搜索树与双向链表
首先面对二叉搜索树,如果用中序遍历,则可以变成有序的形式。

我们需要定义两个指针,来记录遍历的前一节点pre与头节点head。

我这里有疑问的是 对pre、head的初始化,用new就不行了,为啥呢?
class Solution {
public:
Node* pre=NULL;
Node* head=NULL;
void traversal(Node* node){
//中序遍历 左中右
if(node==NULL) return;
traversal(node->left);//左
if(pre!=NULL) pre->right=node;//中
else head=node;
node->left=pre;
pre=node;
traversal(node->right);//右
}
Node* treeToDoublyList(Node* root) {
if(root==NULL) return root;
traversal(root);
head->left=pre;
pre->right=head;
return head;
}
};
二叉搜索树的第K大节点
中序遍历
class Solution {
public:
void traversal(TreeNode* node,vector<int>& path){
if(node==NULL) return;
//中序遍历 左中右
traversal(node->left,path);
path.push_back(node->val);
traversal(node->right,path);
}
int kthLargest(TreeNode* root, int k) {
vector<int> path;
traversal(root,path);
int i=path.size();
while(k--)
{
i--;
}
return path[i];
}
};