《剑指offer》Java实现--寻找二叉树中和为指定值的路径

题目描述

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

思路分析

    以下图二叉树为例,过程分析见表格A:


测试二叉树

表格A

Java代码实现

import java.util.Stack;

/**
 * 在二叉树中找出所有从根节点到叶子节点的路径和为sum的所有路径并输出
 * @author Administrator
 * @version 2018/10/12
 */
public class Exe35_FindPathInBTree {

    public static void main(String[] args) {
        
        TreeNode node10=new TreeNode(10);
        TreeNode node5=new TreeNode(5);
        TreeNode node12=new TreeNode(12);
        TreeNode node4=new TreeNode(4);
        TreeNode node7=new TreeNode(7);
        node10.leftTreeNode=node5;
        node10.rightTreeNode=node12;
        node5.leftTreeNode=node4;
        node5.rightTreeNode=node7;
        findPathInSum(node10, new Stack<TreeNode>(), 22, 0);
        
    }
    
    public static void findPathInSum(TreeNode root,Stack<TreeNode> path,int expectedSum,int currentSum) {
        if(root==null) return;
        else {

            path.add(root);
            currentSum+=root.treeVal;
            boolean isLeafNode=(root.leftTreeNode==null&&root.rightTreeNode==null);
            //如果是叶节点,并且路径和等于期望值,则打印路径
            if(isLeafNode&&currentSum==expectedSum){
                printPath(path);
            }
            
            //如果不是叶节点,则遍历其子节点
            if(root.leftTreeNode!=null){
                findPathInSum(root.leftTreeNode, path, expectedSum, currentSum);
            }
            if(root.rightTreeNode!=null){
                findPathInSum(root.rightTreeNode, path, expectedSum, currentSum);
            }
            
            //返回父节点之前,在路径上删除当前节点
            path.pop();
            
        }
    }
    
    private static void printPath(Stack<TreeNode> path){
        for(int i=0;i<path.size();i++){
            System.out.print(path.get(i)+" ");
        }
        System.out.println();
    }

}

class TreeNode{
    int treeVal;
    TreeNode leftTreeNode;
    TreeNode rightTreeNode;
    public TreeNode(int value) {
        this.treeVal=value;
    }
    @Override
    public String toString() {
        return "Node"+treeVal;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上午11点25从威尼斯到佛罗伦萨的火车,我们还有一个上午可以继续游览威尼斯。前一天我们去两个分岛,主岛上的景点都没...
    土豆片土豆丝土豆泥阅读 1,846评论 0 0
  • 小伙伴们,这是上海的东方明珠塔吗?
    潇苒妈妈阅读 936评论 0 0
  • "一场秋雨一场寒",几场秋雨不禁想起表姐"秋雨"的名字。或许相信五行缺水而加"霖"字所因,我对雨天也甚是喜欢,喜欢...
    小爪冰凉阅读 1,677评论 0 0
  • 曾被深爱过的孩子, 即使遇到风雨, 也会被爱加持,无需畏恐。
    souljourney阅读 2,454评论 0 1