Leetcode113. Path Sum II

题目:找出从根节点到叶节点的路径中各节点值之和为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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值