学习总结
题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:先序遍历的基础上加工代码
先序遍历 非递归
public void preOrder(TreeNode root){
if (root==null) {
return;
}
Stack<TreeNode> stack = new Stack<>();
ArrayList<TreeNode> list = new ArrayList<>();
TreeNode pNode = root;
while(pNode!=null||!stack.isEmpty()){
if (pNode!=null) {
list.add(pNode);
System.out.println(pNode.val);
stack.push(pNode);
pNode=pNode.left;
}else {
TreeNode node = stack.pop();
pNode = node.right;
}
}
}
借助栈的同时还需要一个list记录节点路径,已经从栈里面弹出的叶子结点或者其父节点,需要在list里面移除,详细看代码
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (root==null) {
return result;
}
ArrayList<TreeNode> list = new ArrayList<>();//记录节点路径
LinkedList<TreeNode> stack = new LinkedList<>();
TreeNode pNode = root;
while(pNode!=null||!stack.isEmpty()){
if(pNode!=null){
stack.push(pNode);
list.add(pNode);
target-=pNode.val;
pNode = pNode.left;
}else{
TreeNode node = stack.pop();
while(node!=list.get(list.size()-1)){
target+=list.get(list.size()-1).val;
list.remove(list.size()-1);
}
if (node.right==null&&target==0) {
ArrayList<Integer> list2 = new ArrayList<>();
for (TreeNode tNode : list) {
list2.add(tNode.val);
}
result.add(list2);
}
if (node.right!=null) {
pNode=node.right;
}
}
}
return result;
}