Leetcode113. Path Sum II

来源:互联网 发布:网络弊大于利总结陈词 编辑:程序博客网 时间:2024/06/06 14:27

题目:找出从根节点到叶节点的路径中各节点值之和为sum的所有路径,并返回。

思路:用数组nodeList保存从根节点到现在节点的 路径中的节点。再用flagList来保存每个节点的遍历情况,0表示对应的节点只遍历了左节点,1表示已经遍历了左节点和右节点,再一次过来就可以删除了。思路很简单,下面是代码。

我的leetcode的所有代码已经放入github:https://github.com/gaohongbin/leetcode

代码:


/** *             5 *            / \ *           4   8 *          /   / \ *         11  6   7 * * @author hongbin.gao * */public class Leetcode113 {public static void main(String[] args){TreeNode head = new TreeNode(5);TreeNode p1 = new TreeNode(4);TreeNode p2 = new TreeNode(8);TreeNode p3 = new TreeNode(11);TreeNode p4 = new TreeNode(6);TreeNode p5 = new TreeNode(7);head.left = p1; head.right = p2;p1.left =p3; p1.right = null;p2.left = p4; p2.right = p5;p3.left = p3.right = null;p4.left = p4.right = null;p5.left = p5.right = null;int sum = 20;List<List<Integer>> list = pathSum(head, sum);System.out.println(list);} public static List<List<Integer>> pathSum(TreeNode root, int sum) {         List<List<Integer>> list = new ArrayList<List<Integer>>();  //最终返回的结果        List<Integer> subList;        if(root == null)        return list;                 List<TreeNode> nodeList = new ArrayList<TreeNode>();  //栈用来保存节点        List<Integer> flagList = new ArrayList<Integer>();   //占用来保存标识,0表示该节点只遍历了左子树,1表示已经遍历了右子树。        TreeNode p = root;                while(!nodeList.isEmpty() || p!=null){        if(p==null){  //p为null        int flag = flagList.get(flagList.size()-1);                while(flag==1 && nodeList.size()>=1){        sum += nodeList.remove(nodeList.size()-1).val;  //弹出树节点。并修改sum        flagList.remove(flagList.size()-1);        if(flagList.isEmpty())        return list;        flag = flagList.get(flagList.size()-1);  //取最上面的标识,看是不是要继续弹出        }                p = nodeList.get(nodeList.size()-1).right;  //当flag为0时,取其右节点        flagList.set(flagList.size()-1,1);  //将要访问右节点,所以换标示        }        else if(p.left == null && p.right ==null){ //p为叶节点        nodeList.add(p);  //加入叶子节点         flagList.add(1); //因为是叶子节点,所以直接标识为1        sum -= p.val;  //修改sum        p = null;   //p==null,会从nodeList弹出节点                if(sum == 0){        subList = new ArrayList<Integer>();        for(int i=0;i<nodeList.size();i++){        subList.add(i, nodeList.get(i).val);  //完成subList        }        list.add(subList);     //将subList加入list        }                }        else{  //p为普通节点        sum -= p.val;        nodeList.add(p);        flagList.add(0);                p = p.left;        }        }                return list; }}



0 0
原创粉丝点击