每日编程题

1.二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

求解思路

二叉搜索树即空树或左子树所有节点均小于根节点,右子树所有节点均大于根节点,且其左右子树分别满足二叉搜索树。后序遍历的最后一个节点即为根节点,前面分别为左右子树, 即分为两部分,一部分小于根节点,一部分大于根节点,且其分别满足上述条件。 使用递归最合适。

代码

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0)
            return false;
        int end = sequence.length-1;
        return verify(sequence, 0, end);
    }
    
    public boolean verify (int[] sequence, int begin, int end){
        if(begin>=end)
            return true;//剩下1个或0个节点返回true
        int root = sequence[end];
        int i, j;
        for(i=begin; i<end; i++){
            if(sequence[i]>root)
                break;
        }//定位到中间
        for(j=end-1; j>=begin; j--)
            if(sequence[j]<root)
                break;//定位到中间
        if(i != j+1)
            return false;
        //递归左右子树的结果
        return verify(sequence, begin, j) && verify(sequence, i, end-1); 
    }
}
2.二叉中和为某一数的路径

题目描述

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

求解思路

主要想法使用深度优先的树搜索算法,并在搜索过程中记录路径节点,到达叶子节点检查是否满足条件

代码

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
        if(root!=null)
            find(listAll, new ArrayList<Integer>(), root, target);
        return listAll;
        
    }
    public void find(ArrayList<ArrayList<Integer>> listAll, ArrayList<Integer> list, TreeNode root, int target){
        list.add(root.val);//深度便利记录路径
        if(root.left==null && root.right==null){
            if(root.val == target)
                listAll.add(list);//叶子节点检查满足和的条件
            return;
        }
        ArrayList<Integer> list2 = new ArrayList<Integer>();
        list2.addAll(list);
        if(root.left!=null)
            find(listAll,list, root.left, target-root.val);
        if(root.right!=null)
            find(listAll, list2, root.right, target-root.val);
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值