剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)

来源:互联网 发布:淘宝店铺改名字和头像 编辑:程序博客网 时间:2024/06/05 09:01

问题描述:

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

public class TreeNode {    int val = 0;    TreeNode left = null;    TreeNode right = null;    public TreeNode(int val) {        this.val = val;    }}

思路:利用前序遍历二叉树,并借助一个栈来存储根到叶子节点的路径,对每个节点,先检查当前节点是否是叶子节点,若是则打印路径。否则看它的左子树是否为空,不为空则递归的检查,此时新的和值应该加上当前节点的值。同样的右子树也是一样。
代码如下:未经过验证。

public class FindPath {    void findPath(TreeNode root, int expectedSum){        if(root == null){            return;        }        Stack<Integer> path = new Stack<Integer>();        int currentSum = 0;        findPath(root, expectedSum, path, currentSum);    }    void findPath(TreeNode root, int eS, Stack<Integer> path, int cS){        cS += root.data;        path.push(root.data);        boolean isLeaf = (root.left == null && root.right == null);        //若当前结点不是叶子结点,且当前路径中的和为所给和值,则打印出该路径        if(cS == eS && isLeaf){            for(int i = 0; i < path.size(); i++){                System.out.print(path.get(i)+" ");            }            System.out.println();        }        //若左子树不为空,则递归查找        if(root.left != null){            findPath(root.left, eS, path, cS);        }        //若右子树不为空,则递归查找        if(root.right != null){            findPath(root.right, eS, path, cS);        }        //在返回父结点之前,在路径上删除当前结点        path.pop();    }}class TreeNode{    int data;    TreeNode left;    TreeNode right;    public TreeNode(int x){        data = x;        left = null;        right = null;    }}
0 0