二叉树中和为某一值的路径

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

/**
 * 我的想法是:先序遍历,边遍历边记录路径,直到访问到一个叶子节点的时候,再进行比较.
 * 初始状态为:一个只压入root的栈(stack), 当前路径总和(sum)=0,
 *          分别定义一个记录当前路径的list(aPath), 和记录所有符合条件路径的list(allPath)
 * 只要栈不为空就循环执行:
 *          弹出栈顶节点,作为当前节点,并加入路径,计算当前sum.
 *          压入不为空的左右子树,先序遍历,所以先压右子树,再压左子树
 *          如果当前结点没有左右子树,说明是个叶子节点,进行sum和target的比较:
 *              相等说明当前路径符合要求,加入总路径allPath
 *          不管是否相等都需要返回到上一个栈的状态:
 *              因为压入的栈元素个数和路径记录的节点个数有可能不同,而且必定栈元素个数少于路径节点个数
 *              所以不断去掉aPath的最后一个元素,直到两者个数一样,即返回到上一个栈的状态
 * 结束循环,返回allPath
 *
 */
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        ArrayList<ArrayList<Integer>> allPaths = new ArrayList<>(); //记录所有路径
        ArrayList<Integer> aPath = new ArrayList<>();               //记录当前路径
        Stack<TreeNode> stack = new Stack<>();                      //用来实现非递归的遍历
        int sum = 0;                                                //记录当前路径所有节点的和

        if (root == null) return allPaths;

        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            aPath.add(node.val);
            sum += node.val;

            if (node.right != null) stack.push(node.right);
            if (node.left != null) stack.push(node.left);

            if (node.right == null && node.left == null) {
                if (sum == target) {
                    allPaths.add((ArrayList<Integer>) aPath.clone());  //避免修改aPath的时候被联动修改
                }
                while (stack.size() != aPath.size()) {                 //返回到和当前栈一样的状态
                    sum -= aPath.remove(aPath.size()-1);
                }
            }
        }
        return allPaths;
}

 

posted @ 2018-04-22 20:22  _weirdly  阅读(115)  评论(0编辑  收藏  举报