Day 15

zhanglei 2022年08月05日 390次浏览

Day 15

剑指offer 33.二叉搜索树的后序遍历序列

题目描述

image-20220805153828194

解答

lass Solution {
     public boolean verifyPostorder(int[] postorder) {
        return recur(postorder, 0, postorder.length - 1);
    }

    private boolean recur(int[] postorder, int left, int right) {
        //(结束条件最后看!)左右指针重合的时候,即left~right区间只有一个数
        if (left >= right) {
            return true;
        }
        //在后序遍历中根节点一定是最后一个点
        int root = postorder[right];
        int index = left;
        while (postorder[index] < root) {
            index++;
        }
        int m = index;//left~right之间第一个比root大的点,即root右子树中最小的点(右子树后序遍历的起点)
        //如果m~right区间(root的右子树)出现了比root小的节点,则不可能是后序遍历
        while (index < right) {
            if (postorder[index] < root) {
                return false;
            }
            index++;
        }
        //此时能保证left ~ m-1都比root小,m ~ right-1都比root大,但这两个子区间内部的情况需要继续递归判断
       & return recur(postorder, left, m - 1) & recur(postorder, m, right - 1);
    }
}

剑指offer 34.二叉树中和为某一值的路径

题目描述

image-20220805154605238

思路–回溯算法

由于必须要从根节点开始,因此要用前序遍历(DFS)

回溯算法的核心就是:一条路没走通,路径返回一步,再走

image-20220805203835267

解答

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    LinkedList<List<Integer>> res = new LinkedList<>();
    LinkedList<Integer> path = new LinkedList<>(); 
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        recur(root, sum);
        return res;
    }
    // 构造recur(root,tar)函数,作用是将符合条件的path,加入到res中
    void recur(TreeNode root, int tar) {
        // 递归结束条件
        if(root == null) return;
        // 将当前根节点加入到路径中
        path.add(root.val);
        tar -= root.val;
        //如果是叶子节点,并且和刚好为sum,将组合加入res
        if(tar == 0 && root.left == null && root.right == null){
            //将 path 拷贝到新的newPath中
            LinkedList newPath=new LinkedList<>(path);
        	//将 newPath 加入到结果集 res 中
            res.add(newPath);
        }
       // 如果不是叶子节点,继续递归,直到递归结束
        if(root.left!=null)
        recur(root.left, tar);
        if(root.right!=null)
        recur(root.right, tar);
       // 如果一条路遍历到底,root=null 还不满足tar==0,路径回退一步, 即删除路径中的最后一个节点值
        path.removeLast();
    }
}