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();
}
}
剑指offer 25 题 ,java 递归实现
最新推荐文章于 2020-05-31 23:32:31 发布