剑指offer:(25)举例让抽象问题具体化 :二叉搜索树的后序遍历序列
2017-06-16 23:10
579 查看
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
递归版:1)用前序遍历的方式访问到某一节点,把该节点添加到路径上,并累加该节点的值。
2)若该节点为叶节点,且路径中节点值得和等于输入整数,则当前路径符合要求,把它加入总的路径中
3)若不是,则继续访问其子节点
非递归版:
1.按先序遍历把当前节点cur的左孩子依次入栈同时保存当前节点,每次更新当前路径的和sum;
2.判断当前节点是否是叶子节点以及sum是否等于expectNumber,如果是,把当前路径放入结果中。
3.遇到叶子节点cur更新为NULL,此时看栈顶元素,如果栈顶元素的把栈顶元素保存在last变量中,同时弹出栈顶元素,当期路径中栈顶元素 弹 出,sum减掉栈顶元素,这一步骤不更改cur的值;
4.如果步骤3中的栈顶元素的右孩子存在且右孩子之前没有遍历过,当前节点cur更新为栈顶的右孩子,此时改变cur=NULL的情况
思路:
递归版:1)用前序遍历的方式访问到某一节点,把该节点添加到路径上,并累加该节点的值。
2)若该节点为叶节点,且路径中节点值得和等于输入整数,则当前路径符合要求,把它加入总的路径中
3)若不是,则继续访问其子节点
非递归版:
1.按先序遍历把当前节点cur的左孩子依次入栈同时保存当前节点,每次更新当前路径的和sum;
2.判断当前节点是否是叶子节点以及sum是否等于expectNumber,如果是,把当前路径放入结果中。
3.遇到叶子节点cur更新为NULL,此时看栈顶元素,如果栈顶元素的把栈顶元素保存在last变量中,同时弹出栈顶元素,当期路径中栈顶元素 弹 出,sum减掉栈顶元素,这一步骤不更改cur的值;
package jianzhioffer; import java.util.ArrayList; import java.util.Stack; public class Solution25 { public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } //方法一:递归 ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> list = new ArrayList<Integer>(); public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { if(root==null) return listAll; list.add(root.val); target -=root.val; if(target == 0 && root.left ==null && root.right == null) //走到叶子节点,且总节点之和满足要求,则将list中的值就是一个符合要求的序列 listAll.add(new ArrayList<Integer>(list)); FindPath(root.left, target); FindPath(root.right, target); //便利过的叶子节点不再便利 list.remove(list.size()-1); return listAll; } //方法二:递归 /* public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>(); if(root == null) return listAll; Stack<Integer> stack = new Stack<Integer>(); int sum = 0; FindPath(root, target,listAll,stack,sum); return listAll; } void FindPath(TreeNode root, int target, ArrayList<ArrayList<Integer>> listAll, Stack<Integer> stack, int sum) { if(root==null) return; sum+=root.val; //走到叶子节点,且总节点之和满足要求,则将list中的值就是一个符合要求的序列 if(root.left==null&&root.right==null){ if(sum==target) { stack.push(root.val); listAll.add(new ArrayList<Integer>(stack)); stack.pop(); } return; } stack.push(root.val); FindPath(root.left, target, listAll, stack, sum); FindPath(root.right, target, listAll, stack, sum); stack.pop(); }*/ }
4.如果步骤3中的栈顶元素的右孩子存在且右孩子之前没有遍历过,当前节点cur更新为栈顶的右孩子,此时改变cur=NULL的情况
相关文章推荐
- 【剑指offer】4.3举例让抽象问题具体化——面试题24:二叉搜索树的后序遍历序列
- 剑指offer:(23)举例让抽象问题具体化 :二叉搜索树的后序遍历序列
- 举例让抽象问题具体化:二叉搜索树的后序遍历序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题25:二叉树中和为某一值的路径
- 【剑指offer】4.3举例让抽象问题具体化——面试题22:栈的压入、弹出序列
- 剑指offer 4.3 举例形象化问题4-二叉搜索树的后续遍历序列
- 《剑指offer》刷题笔记(举例让抽象具体化):二叉搜索树的后序遍历序列
- (C++)剑指offer-23:二叉搜索树的后序遍历序列(举例让抽象具体化)
- 【剑指Offer学习】【面试题24:二叉搜索树的后序遍历序列】
- 【剑指Offer】二叉搜索树的后序遍历序列
- 【九度OJ1367】|【剑指offer24】二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 剑指offer:二叉搜索树的后序遍历序列
- 剑指offer 24- 二叉搜索树的后序遍历序列
- 剑指offer--二叉搜索树的后序遍历序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题21:包含min函数的栈
- 【剑指offer】十六,二叉搜索树的后序遍历序列
- [剑指offer][面试题24]二叉搜索树的后序遍历序列
- 剑指offer 面试题24—二叉搜索树的后序遍历序列
- 【剑指Offer面试题】 九度OJ1367:二叉搜索树的后序遍历序列