思路:dfs算法,递归结束条件是:走到叶子结点且target==路径上所有结点之和。可能有多条路径,用List<List<Integer>> res来存储结果;定义List<Integer> collector 存储其中一条路径。(挺难的)
private List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int target) {
List<Integer> collector = new ArrayList<>();
dfs(root,target,collector);
return res;
}
private void dfs(TreeNode root,int target,List<Integer> collector){
if (root == null)
return;
collector.add(root.val);
target -= root.val;
// 递归结束条件
if (target == 0 && root.left == null && root.right == null){
res.add(new ArrayList<>(collector));
}else {
dfs(root.left,target,collector);
dfs(root.right,target,collector);
}
collector.remove(collector.size()-1);
}
思路:题目要求“排序的”,首先考虑到中序遍历搜索二叉树得到有序链表(先dfs(node.left)->处理当前结点->dfs(node.right))。
递归结束条件是当前结点为空。若当前结点是第一个结点,则将head指向当前节点;若当前结点为中间结点,则pre.right=cur、cur.left=pre完成双向链表的构建;最后pre=cur继续遍历。
Node pre,head;
public Node treeToDoublyList(Node root) {
if (root == null)
return null;
dfs(root);
// 循环链表
head.left = pre;
pre.right = head;
return head;
}
private void dfs(Node cur){
// 递归结束条件
if (cur == null)
return;
// 中序遍历搜索二叉树是有序列表
dfs(cur.left);
if (pre == null){//第一个结点
head = cur;
}else { // 中间结点 形成双向链表
pre.right = cur;
cur.left = pre;
}
// 注意这句在if else之外。
// 因为无论当前结点是第一个结点还是中间节点,都要向后遍历
pre = cur;
dfs(cur.right);
}
思路:简单。考虑到按照右->中->左的顺序遍历,得到的是从大到小排序的序列,第k-1个元素即为第k 大的元素。
List<Integer> res = new ArrayList<>();
public int kthLargest(TreeNode root, int k) {
if (root == null)
return 0;
dfs(root);//得到从大到小排序的数组
return res.get(k-1);
}
private void dfs(TreeNode node){
if (node == null)
return;
dfs(node.right);
res.add(node.val);
dfs(node.left);
}