剑指Offer面试题24二叉搜索树的后序遍历序列(递归),面试题25二叉树中和为某一值的路径(栈)

来源:互联网 发布:58端口使用技巧 编辑:程序博客网 时间:2024/05/30 23:39

面试题24:二叉搜索树的后序遍历序列(递归)

输入一个数组,判断数组是不是二叉搜索树的后序遍历结果。

思路:注意是搜索树,即左孩子<根<右孩子,后序序列的最后一个数是根,前边比根小的是左子树,比根大的是右子树,然后对左右子树递归。

相关题目:后序变成前序也是这个思路,树的遍历关键都是先找根结点。

本题Java实现如下:

public class VerifySequenceOfBST {private boolean verifySequenceOfBST(int[] arr){if(arr == null || arr.length<=0){return false;}int root = arr[arr.length-1];//后序的最后一个数是根int i = 0;//分割数组为左右子树,是右子树开始位置的下标for(;i<arr.length-1;i++){if(arr[i] > root){//左子树结点小于根节点break;}}int j = i;for(;j<arr.length-1;j++){//右子树结点大于根节点if(arr[j] < root){return false;}}//递归判断左子树是不是二叉搜索树boolean left = true;if(i > 0){left = verifySequenceOfBST(Arrays.copyOfRange(arr, 0, i));}//递归判断右子树是不是二叉搜索树boolean right = true;if(i < arr.length-1){right = verifySequenceOfBST(Arrays.copyOfRange(arr, i, arr.length-1));//记得去掉最后一个根结点}return left && right;}public static void main(String[] args) {VerifySequenceOfBST test = new VerifySequenceOfBST();int[] a = {5,7,6,9,11,10,8};System.out.println(test.verifySequenceOfBST(a));}}

面试题25:二叉树中和为某一值的路径(栈)

输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径,路径为从根结点一直到叶结点。

思路:四步,1,既然是先输出根结点,那么肯定是先序遍历,把结点添加到输出路径中并累加其值,2,如果访问到的结点是叶结点并且值之和满足条件,则打印路径,3,如果当前结点不是叶结点,就继续递归访问其子结点。4,当前结点访问结束后,递归函数自动回到其父结点,所以在函数退出前要删掉路径上的该结点并减去其值,保证返回父结点时的路径是从根结点到父结点。可以看出保存路径的数据结构是后进先出的栈。

本题Java实现如下:

public class FindPath {private void findPath(BiTree root,int expectedSum){if(root == null){return ;}Stack<Integer> path = new Stack<>();int currentSum = 0;findPath(root,expectedSum,path,currentSum);}private void findPath(BiTree root,int expectedSum,Stack<Integer> path,int currentSum){//第一步,把结点加入路径,累加和path.push(root.value);currentSum += root.value;//第二步,如果结点是叶结点并满足值相等的条件,打印路径boolean isLeaf = root.left == null && root.right ==null;if(currentSum == expectedSum && isLeaf){System.out.println("A path is found:" + path);}//第三步,如果结点不是叶结点,递归访问子结点if(root.left != null){findPath(root.left,expectedSum,path,currentSum);}if(root.right != null){findPath(root.right,expectedSum,path,currentSum);}//第四步,结点是叶结点,但是值不相等,函数退出到其父结点,在路径中删去这个结点path.pop();currentSum -= root.value;}public static void main(String[] args) {FindPath test = new FindPath();BiTree A1 = new BiTree(1);BiTree A2 = new BiTree(2);BiTree A3 = new BiTree(3);BiTree A4 = new BiTree(4);BiTree A5 = new BiTree(1);A1.left = A2;A1.right = A3;A2.left = A4;A2.right = A5;test.findPath(A1, 4);}}class BiTree{int value;BiTree left,right;BiTree(int x){value = x;}}

0 0
原创粉丝点击