1、输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析:
需要输出一个二叉树中结点值的和为输入整数的所有路径,每个路径都定义是一条从根节点到叶节点的序列。步骤:
1>深度遍历二叉树,将遍历得到的每条序列都放入一个数组中
2>在每次遍历的时候,每遍历到一个节点,将该节点放入一个列表中,并用这个整数减去该节点的值。对每个节点的左右子树节点进行递归遍历,重复以上的操作,直到叶子结点且该整数变为零为止。将得到的这个序列放入最终的结果数组中。
3>重复步骤2,直到将所有正确的数组序列都放入了结果数组中。
public class Solution {
private ArrayList<Integer> list = new ArrayList<Integer>();//存放每次遍历的序列
//存放最终合适的序列
private ArrayList<ArrayList<Integer>> resultList = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null){
return resultList;
}
if(root!=null){
list.add(root.val);
target=target-root.val;
if(target==0&&root.left==null&&root.right==null){
resultList.add(new ArrayList<Integer>(list));
}
}
FindPath(root.left,target);
FindPath(root.right,target);
list.remove(list.size()-1);
return resultList;
}
}
2、输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
分析:
1.对链表中的每个节点进行复制并加在就节点后
2.对链表中的随机后继节点进行复制
3.将新复制的节点从就链表中分离出来
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
//判断节点是否为空
if(pHead==null){
return null;
}
RandomListNode node = pHead;
//1.对链表中的每个节点进行复制并加在就节点后
while(node!=null){
RandomListNode cloneNode = new RandomListNode(node.label);//为旧节点复制新的节点
RandomListNode n = node.next;
node.next = cloneNode;
cloneNode.next = n;//将新的节点加在旧节点后面
node = n;
}
//2.对链表中的随机后继节点进行复制
node = pHead;
while(node!=null){
node.next.random = node.random==null?null:node.random.next;//将旧节点的随机后继节点复制
node = node.next.next;
}
//3.将新复制的节点从就链表中分离出来
node = pHead;
RandomListNode n = pHead.next;
while(node!=null){
RandomListNode cloneNode = node.next;
node.next = cloneNode.next;
cloneNode.next = cloneNode.next==null?null:cloneNode.next.next;
node = node.next;
}
return n;
}
}