首页 > 其他分享 >代码随想录day18|

代码随想录day18|

时间:2023-03-04 23:55:14浏览次数:51  
标签:right return int root 代码 随想录 null day18 节点

找树左下角的值

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

分析 用层序遍历 最底层的最左节点   递归 记录第一次到达下一层的节点值

class Solution {
    private int Deep=-1;
    private int value=0;

    public int findBottomLeftValue(TreeNode root) {
        if(root==null) return 0;
        dfs(root,0);
        return value;
    }

    private void dfs(TreeNode root,int deep){
        if(root==null) return;
        if(root.left==null&&root.right==null){
            if(deep>Deep){
                value=root.val;
                Deep=deep;
            }
        }
        if(root.left!=null) dfs(root.left,deep+1);
        if(root.right!=null) dfs(root.right,deep+1);
    }
}
//迭代 层序
class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Deque<TreeNode> deque= new LinkedList<>();
        if(root!=null) deque.offer(root);
        int res=0;
        while(!deque.isEmpty()){
            int len=deque.size();
            for(int i=0;i<len;i++){
                TreeNode temp = deque.poll();
                if(i==0){
                    res=temp.val;
                }
                if(temp.left!=null) deque.offer(temp.left);
                if(temp.right!=null) deque.offer(temp.right);
            }
        }

        return res;
    }
}

路径总和

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

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

分析 每次递归 targetSum -= root.val;  判断到叶子节点时 targetSum==0?

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null) {
            return false;
        }

        targetSum-=root.val;
        if(root.left==null&&root.right==null){
            return targetSum==0;
        }
        if(root.left!=null){
            boolean left=hasPathSum(root.left,targetSum);
            if(left){
                return true;
            }
        }

        if(root.right!=null){
            boolean right=hasPathSum(root.right,targetSum);
            if(right){
                return true;
            }
        }

        return false;

    }
}

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

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

分析 遍历的逻辑就是分割中序和后序遍历数组,对后序数组来说,数组的最后一个元素一定是根节点,根据根节点的位置,分割中序遍历的数组,分割成leftIn和rightPost,再根据中序分割的位置,分割后序数组,

class Solution {
    Map<Integer, Integer> map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        map=new HashMap<>();
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }

        return findNode(inorder,0,inorder.length,postorder,0,postorder.length);
    }

    public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd){
        if(inBegin>=inEnd||postBegin>=postEnd){
            return null;
        }

        int rootIndex=map.get(postorder[postEnd-1]);//找到根节点
        TreeNode root = new TreeNode(inorder[rootIndex]);
        int lenIndex=rootIndex-inBegin;
        System.out.println("rootIndex"+rootIndex+" lenIndex"+lenIndex);
        root.left=findNode(inorder,inBegin,rootIndex,postorder,postBegin,postBegin+lenIndex);
        root.right=findNode(inorder,rootIndex+1,inEnd,postorder,postBegin+lenIndex,postEnd-1);
        return root;
    }
}

 

标签:right,return,int,root,代码,随想录,null,day18,节点
From: https://www.cnblogs.com/Liu5419/p/17179552.html

相关文章