简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)

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

思路:很明显用前序遍历可以从根节点开始遍历到叶子节点,然后将遍历的节点添加到栈中进行保存路径。并且设置一个sum变量来记录节点值的和。通过对sum的操作来达到目的。

将抽象的问题具体化:

Java代码:

import java.util.Stack;


public class SumPath {
    public class BinaryTreeNode{
        int m_nValue;
        BinaryTreeNode m_nLeft;
        BinaryTreeNode m_nRight;
    }
    public BinaryTreeNode createBinaryTree(int[] pre,int start,int[] ord,int end,int length){
        if(pre==null||ord==null||pre.length!=ord.length||length<=0)
            return null;
        int value=pre[start];
        BinaryTreeNode root=new BinaryTreeNode();
        root.m_nValue=value;
        root.m_nLeft=root.m_nRight=null;
        if(length==1){
            if(pre[start]==ord[end])
                return root;
            else
                throw new RuntimeException("inVaild put!");
        }
        //在中序遍历的序列中找到根节点
        int i=0;
        for(;i<length;i++){
            if(ord[end-i]==value)
                break;
        }
        if(i==length)
            throw new RuntimeException("inVaild put!");
        int left=length-i-1;
        int right=i;
        if(left>0)
            root.m_nLeft=createBinaryTree(pre,start+1,ord,end-i-1,length-i-1);
        if(right>0)
            root.m_nRight=createBinaryTree(pre,start+length-i,ord,end,i);
        return root;
    }
    public void sumPath(BinaryTreeNode root,int sum){
        if(root==null)
            return;
        Stack<Integer> stack=new Stack<Integer>();
        findPath(root,sum,stack);
    }
    public void findPath(BinaryTreeNode root, int sum, Stack<Integer> stack) {
        if(root==null)
            return;
        //当遍历到叶子节点的时候,计算整个路径上的值是否为指定的值
        if(root.m_nLeft==null&&root.m_nRight==null)
        {
            if(root.m_nValue==sum){
                for(int i:stack)
                    System.out.print(i+",");
            System.out.println(root.m_nValue);
            }
        }
        stack.push(root.m_nValue);
//sum-root.m_nValue减去父节点的值,直到叶子几点,如果叶子节点等于剩下的值,那么就遍历成功。
if(root.m_nLeft!=null) findPath(root.m_nLeft,sum-root.m_nValue,stack); if(root.m_nRight!=null) findPath(root.m_nRight,sum-root.m_nValue,stack); stack.pop(); } public static void main(String[] args){ int[] a={3,4,6,8,5,7,9}; int[] b={6,4,8,3,7,5,9}; SumPath sumPath=new SumPath(); BinaryTreeNode pHead=sumPath.createBinaryTree(a, 0, b, 6, a.length); sumPath.sumPath(pHead, 15); } }

 

posted @ 2015-08-19 09:33  lisahappy  阅读(328)  评论(0编辑  收藏  举报