代码随想录算法训练营第十八天| 二叉树 |V

513.找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue queue = new LinkedList<>();
        int res = 0;
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i=size;i>0;i--){
                TreeNode node = queue.poll();
                if(i==size){
                    res = node.val;
                }
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }
        }
        return res;
    }
}

 本题用迭代法,层序遍历比较简单

112.路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null){
            return false;
        }
        return helper(root,targetSum,0);
    }
    private boolean helper(TreeNode node, int targetSum, int currSum){
        if(node.left==null&&node.right==null){
            int temp = currSum + node.val;
            return temp==targetSum;
        }
        if(node.left!=null){
            if(helper(node.left,targetSum,currSum+node.val)){
                return true;
            }
        }
        if(node.right!=null){
            if(helper(node.right,targetSum,currSum+node.val)){
                return true;
            }
        }
        return false;
    }
}

 本题用递归比较好解决

终止条件是到达叶子节点检查当前Sum和targetSum是否相等

106. 从中序与后序遍历构造二叉树

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    Map map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        map = new HashMap<>();
        // 用map保存中序序列的数值对应位置
        for(int i=0;i=inEnd || postBegin>=postEnd){
            return null;
        }
        // 找到后序序列最后一个元素在前序序列中的位置
        int rootIndex = map.get(postorder[postEnd-1]);
        // 这个元素就是中间的root
        TreeNode root = new TreeNode(inorder[rootIndex]);
        // 左子树的大小
        int lenOfLeft = rootIndex-inBegin;
        // 递归 注意始终保持前闭后开
        root.left = findNode(inorder,inBegin,rootIndex,postorder,postBegin, postBegin+lenOfLeft);
        root.right = findNode(inorder,rootIndex+1,inEnd,postorder,postBegin+lenOfLeft, postEnd);
    }
}
  • 第一步:如果数组大小为零的话,说明是空节点了。

  • 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

  • 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

  • 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

  • 第五步:切割后序数组,切成后序左数组和后序右数组

  • 第六步:递归处理左区间和右区间

注意始终保持前闭后开

你可能感兴趣的:(数据结构)