LintCode刷题之路---二叉树的路径

题目:给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径。

一个有效的路径,指的是从根节点到叶节点的路径。

例:

给定一个二叉树,和 目标值 = 5:

     1
    / \
   2   4
  / \
 2   3

返回:

[
  [1, 2, 2],
  [1, 4]
]

看完题目,发现是和二叉树相关的题目,不由得,又温习了一遍二叉树的遍历

首先定义一下通用是树结构

public class TreeNode {
     public int val;
     public TreeNode left, right;
     public TreeNode(int val) {
         this.val = val;
         this.left = this.right = null;
     }
 }
1、先序遍历
 public static void preOrderTraverse(TreeNode node) {  
        if (node == null)  
            return;  
        System.out.print(node.val+ " ");  
        preOrderTraverse(node.left);  
        preOrderTraverse(node.right);  
 }  

2、中序遍历

public static void inOrderTraverse(TreeNode node) {  
        if (node == null)  
            return;  
        inOrderTraverse(node.left);  
        System.out.print(node.val + " ");  
        inOrderTraverse(node.right);  
}
3、后序遍历

public static void inOrderTraverse(TreeNode node) {  
        if (node == null)  
            return;  
        inOrderTraverse(node.left);    
        inOrderTraverse(node.right); 
        System.out.print(node.val + " ");
}
然后在看问题,要求是找出所有符合的路径。那么首先就需要的是遍历所有的路径,一个比较简单的方法,就是使用栈把当前节点的值,放入栈中,然后用于计算

Stack<Integer> tempStack = new Stack<Integer>();
tempStack .push(root.val);
然后根据从左到右的顺序,递归计算,到达最底层时,开始出栈
if(root.left != null)
        递归 
if(root.right != null)
        递归
tempStack .pop();

代码实现如下:

public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) {
        List<List<Integer>> path = new ArrayList<List<Integer>>();
        if(null == root) return path ;
        Stack<Integer> tempStack = new Stack<Integer>();
        getResultPath(path, tempStack, root, 0, target);
        return path;
    }
public void getResultPath(List<List<Integer>> path, Stack<Integer> tempStack, TreeNode root, int sum, int target) {
        sum += root.val;
        tempStack.push(root.val);
        if(sum == target && root.left == null && root.right == null) {
            List<Integer> list = new ArrayList<Integer>(tempStack);
            path.add(list);
            tempStack.pop();
            return;
        }else {
            if(root.left != null)
               getResultPath(path, tempStack, root.left, sum, target);
            if(root.right != null)
               getResultPath(path, tempStack, root.right, sum, target);
            tempStack.pop();
        }
    }








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值