剑指offer 25 题 ,java 递归实现

来源:互联网 发布:乐视电视网络连接失败 编辑:程序博客网 时间:2024/05/16 19:08
package shuati;import java.util.Stack;import java.util.Vector;/** * 剑指 offer 25 题,递归实现 * Created by cheng on 2017/10/11. */class BinaryTreeNode {    int value;    BinaryTreeNode left;    BinaryTreeNode right;    BinaryTreeNode(int value) {        this.value = value;    }}public class BianLiShuDengYuGeiDingHe {    public static void main(String[] args) {        // 构造一颗二叉树        BinaryTreeNode a = new BinaryTreeNode(10);        BinaryTreeNode b = new BinaryTreeNode(5);        BinaryTreeNode c = new BinaryTreeNode(8);        BinaryTreeNode d = new BinaryTreeNode(4);        BinaryTreeNode e = new BinaryTreeNode(7);        BinaryTreeNode f = new BinaryTreeNode(4);        BinaryTreeNode g = new BinaryTreeNode(2);        BinaryTreeNode h = new BinaryTreeNode(1);        BinaryTreeNode i = new BinaryTreeNode(3);        BinaryTreeNode j = new BinaryTreeNode(2);        BinaryTreeNode k = new BinaryTreeNode(1);        BinaryTreeNode l = new BinaryTreeNode(2);        BinaryTreeNode m = new BinaryTreeNode(1);        a.left = b;        a.right = c;        b.left = d;        b.right = e;        c.left = f;        c.right = g;        d.left = h;        d.right = i;        g.left = j;        g.right = k;        h.right = l;        l.right = m;        // 用来保存 递归调用走过的路径        Stack stack = new Stack();        new BianLiShuDengYuGeiDingHe().resolve(0, 22, a, stack);    }    /**     * 打印满足条件的路径,递归实现     *     * @param value 记录遍历到当前节点时,节点值的和     * @param valve 要求满足的值,示例中为 22     * @param node  当前的节点     * @param stack 记录走到该节点时,所有经过的路径,方便打印路径     */    public void resolve(int value, int valve, BinaryTreeNode node, Stack<BinaryTreeNode> stack) {        // node 值为空,直接返回        if (node == null) {            return;        }        // 加上当前节点的值,并把当前节点放到栈中        value += node.value;        stack.add(node);        // 如果此时的值已经大于了所要求的值,则返回        if (value > valve) {            stack.pop();            return;        }        // 正好满足条件时,值相等,并且也是叶子节点,打印出遍历到的节点值        if (value == valve && node.right == null && node.left == null) {            for (BinaryTreeNode i : stack) {                System.out.print(i.value + " ");            }            System.out.println();            stack.pop();            return;        }        // 递归左子树        resolve(value, valve, node.left, stack);        // 递归右子树        resolve(value, valve, node.right, stack);        stack.pop();    }}
原创粉丝点击