递增顺序搜索树:
原题链接: leetcode 897.递增顺序搜索树
关键词: 树的遍历、DFS
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
输入:root = [5,1,7]
输出:[1,null,5,null,7]
分析:
BST的中序遍历是有序的,题目的做法也就是将树的中序遍历变成一个链表。
因此只要做中序遍历,同时把当前的结点插入为当前尾结点的右孩子即可,并且将尾结点更新为当前结点即可。
常用技巧:不确定是否有根结点的时候,可以用虚拟头结点。
代码实现:
/**
* 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:
TreeNode* tail; //定义一个尾结点
TreeNode* increasingBST(TreeNode* root) {
auto dummy = new TreeNode(-1);
tail = dummy;
dfs(root);
return dummy -> right; //虚拟头结点的右孩子是真实的头结点
}
void dfs(TreeNode* root){ //中序遍历:左孩子 当前结点 右孩子
if(!root) return;
dfs(root -> left);
tail -> right = root; //当前点放在尾结点后
root -> left = NULL; //当前点左孩子为空
tail = root; //更新尾结点
dfs(root -> right);
}
};
二叉树中和为某一值的路径:
原题链接: AcWing 47.二叉数中和为某一值的路径
来源: 《剑指offer》
关键词: 树的遍历、DFS
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
样例
给出二叉树如下所示,并给出num=22。
5
/ \
4 6
/ / \
12 13 6
/ \ / \
9 1 5 1
输出:[[5,4,12,1],[5,6,6,5]]
分析:
用dfs遍历树,每到一个结点就判断是不是叶子结点?
是叶子结点的话就判断当前总和是否等于目标值,是的话就把当前路径放入结果数组。否则就跳过。
不是叶子结点就用DFS递归它的左右孩子。
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> ans; //结果数组
vector<int> path; //当前路径
vector<vector<int>> findPath(TreeNode* root, int sum) {
dfs(root, 0, sum);
return ans;
}
void dfs(TreeNode* root, int tmp, int sum){
if(!root) return;
path.push_back(root -> val);
tmp += root -> val;
if(!root -> left && !root -> right){ //如果当前结点是叶结点
if(tmp == sum) ans.push_back(path);
}else{
if(root -> left) dfs(root -> left, tmp, sum);
if(root -> right) dfs(root -> right, tmp, sum);
}
path.pop_back(); //恢复现场
}
};