算法笔记|Day14二叉树IV
创始人
2024-11-15 02:33:27
0

算法笔记|Day14二叉树IV

  • ☆☆☆☆☆leetcode 513.找树左下角的值
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 112. 路径总和
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 113.路径总和II
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 106.从中序与后序遍历序列构造二叉树
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 105.从前序与中序遍历序列构造二叉树
    • 题目分析
    • 代码

☆☆☆☆☆leetcode 513.找树左下角的值

题目链接:leetcode 513.找树左下角的值

题目分析

本题递归+回溯,采用前序、中序、后序遍历均可,只需先处理左节点再处理右节点均可,不涉及中节点的处理逻辑;另外可以采用迭代层序遍历更简单。

代码

1.1递归 class Solution {     int maxDepth=Integer.MIN_VALUE;     int result;      public int findBottomLeftValue(TreeNode root) {         result=root.val;         traversal(root,0);         return result;     }      public void traversal(TreeNode root,int depth){         if(root==null)             return;         if(root.left==null&&root.right==null){             if(depth>maxDepth){                 maxDepth=depth;                 result=root.val;             }         }         if(root.left!=null){             depth++;             traversal(root.left,depth);             depth--;         }         if(root.right!=null){             depth++;             traversal(root.right,depth);             depth--;         }     } } 
1.2递归(精简版本) class Solution {     int maxDepth=Integer.MIN_VALUE;     int result;      public int findBottomLeftValue(TreeNode root) {         result=root.val;         traversal(root,0);         return result;     }      public void traversal(TreeNode root,int depth){         if(root==null)             return;         if(root.left==null&&root.right==null){             if(depth>maxDepth){                 maxDepth=depth;                 result=root.val;             }         }         if(root.left!=null)             traversal(root.left,depth+1);         if(root.right!=null)             traversal(root.right,depth+1);     } } 
2.迭代,层序遍历 class Solution {     public int findBottomLeftValue(TreeNode root) {         Deque deque=new LinkedList<>();         deque.add(root);         int res=0;         while(!deque.isEmpty()){             int size=deque.size();             for(int i=0;i                 TreeNode temp=deque.poll();                 if(i==0)                     res=temp.val;                 if(temp.left!=null)                     deque.add(temp.left);                 if(temp.right!=null)                     deque.add(temp.right);             }         }         return res;     } } 

☆☆☆☆☆leetcode 112. 路径总和

题目链接:leetcode 112. 路径总和

题目分析

本题递归+回溯,采用前序、中序、后序遍历均可,不涉及中节点的处理逻辑。

代码

1.1递归+回溯 class Solution {     public boolean hasPathSum(TreeNode root, int targetSum) {         if(root==null)             return false;         return traversal(root,targetSum-root.val);     }      public boolean traversal(TreeNode node,int count){         if(node==null)             return false;         if(node.left==null&&node.right==null&&count==0)             return true;         if(node.left==null&&node.right==null&&count!=0)             return false;         if(node.left!=null){             count-=node.left.val;             if(traversal(node.left,count))return true;             count+=node.left.val;         }         if(node.right!=null){             count-=node.right.val;             if(traversal(node.right,count))return true;             count+=node.right.val;         }         return false;     } } 
1.2递归+回溯(精简版本) 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)             if(hasPathSum(root.left,targetSum))                 return true;         if(root.right!=null)             if(hasPathSum(root.right,targetSum))                 return true;         return false;     } } 
1.3递归+回溯(更精简版本) class Solution {     public boolean hasPathSum(TreeNode root, int targetSum) {         if(root==null)             return false;         if(root.left==null&&root.right==null&&targetSum==root.val)             return true;         return hasPathSum(root.left,targetSum-root.val)||hasPathSum(root.right,targetSum-root.val);     } } 

☆☆☆☆☆leetcode 113.路径总和II

题目链接:leetcode 113.路径总和II

题目分析

递归+回溯,采用前序、中序、后序遍历均可,不涉及中节点的处理逻辑,要遍历所有路径所以递归函数不需要返回值。

代码

class Solution {     List> result;     List path;      public List> pathSum(TreeNode root, int targetSum) {         result=new LinkedList<>();         path=new LinkedList<>();         traversal (root,targetSum);         return result;     }      public void traversal(TreeNode root,int count){         if(root==null)             return;         path.add(root.val);         if(root.left==null&&root.right==null&&count==root.val)             result.add(new LinkedList<>(path));         traversal(root.left,count-root.val);         traversal(root.right,count-root.val);         path.removeLast();     } } 

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

题目链接:leetcode 106.从中序与后序遍历序列构造二叉树

题目分析

递归采用前序遍历,重点在切割两个遍历序列,切割点在后序数组(左右中)的最后一个元素,就是用这个元素来切割中序数组(左中右),所以必要先切割中序数组,区分开左后序、右后序、左中序、右中序四个数组,此题采用左闭右开区间,决定了每个数组的收尾索引值。

代码

class Solution {     Map map;          public TreeNode buildTree(int[] inorder, int[] postorder) {         map=new HashMap<>();         for(int i=0;i         if(inBegin>=inEnd||postBegin>=postEnd)             return null;         int rootIndex=map.get(postorder[postEnd-1]);         TreeNode root=new TreeNode(inorder[rootIndex]);         root.left=findNode(inorder,inBegin,rootIndex,postorder,postBegin,postBegin+(rootIndex-inBegin));         root.right=findNode(inorder,rootIndex+1,inEnd,postorder,postBegin+(rootIndex-inBegin),postEnd-1);         return root;     } } 

提示:inBegin >= inEnd || postBegin >= postEnd不满足左闭右开,说明没有元素,返回空树

☆☆☆☆☆leetcode 105.从前序与中序遍历序列构造二叉树

题目链接:leetcode 105.从前序与中序遍历序列构造二叉树

题目分析

递归采用前序遍历,重点在切割两个遍历序列,切割点在前序数组(中左右)的第一个元素,就是用这个元素来切割中序数组(左中右),所以必要先切割中序数组,区分开左前序、右前序、左中序、右中序四个数组,此题采用左闭右开区间,决定了每个数组的收尾索引值。

代码

class Solution {     Map map;      public TreeNode buildTree(int[] preorder, int[] inorder) {         map=new HashMap<>();         for(int i=0;i         if(preBegin>=preEnd||inBegin>=inEnd)             return null;         int rootIndex=map.get(preorder[preBegin]);         TreeNode root=new TreeNode(inorder[rootIndex]);         root.left=findNode(preorder,preBegin+1,preBegin+(rootIndex-inBegin)+1,inorder,inBegin,rootIndex);         root.right=findNode(preorder,preBegin+(rootIndex-inBegin)+1,preEnd,inorder,rootIndex+1,inEnd);         return root;     } } 

提示:preBegin>=preEnd||inBegin>=inEnd不满足左闭右开,说明没有元素,返回空树

相关内容

热门资讯

据文件显示!钱柜娱乐辅助透视挂... 据文件显示!钱柜娱乐辅助透视挂,空谷幽兰真的有挂,确实有挂实锤;1)钱柜娱乐辅助插件:进一步探索钱柜...
黑科技辅助挂!科乐吉林麻将辅助... 黑科技辅助挂!科乐吉林麻将辅助透视挂,兴动茶馆真的有挂,好像竟然有挂1、科乐吉林麻将有没有辅助教程、...
据权威媒体报道!徽友辅助透视挂... 据权威媒体报道!徽友辅助透视挂,皮皮湖南跑胡子确实有挂,真是证实有挂1、上手简单,内置详细流程视频教...
最终!新武宁双扣辅助透视挂,大... 最终!新武宁双扣辅助透视挂,大同麻将真的是有挂,原来有挂规律1、下载好新武宁双扣透视辅助下载之后点击...
攻略辅助挂!325互动辅助透视... 攻略辅助挂!325互动辅助透视挂,97国际真的有挂,切实有挂技术325互动破解侠是真的助透视。每个模...
更值得关注的是!凉山跑得快辅助... 更值得关注的是!凉山跑得快辅助透视挂,闲趣竞技真的是有挂,果然有挂攻略1、让任何用户在无需凉山跑得快...
今天上午!乐山游戏中心辅助透视... 今天上午!乐山游戏中心辅助透视挂,天天河北麻将是有挂,确实有挂秘籍1、下载好乐山游戏中心透视辅助下载...
截至目前!v湘西辅助透视挂,欢... 截至目前!v湘西辅助透视挂,欢乐惠游是真的有挂,好像有挂规律1、让任何用户在无需欢乐惠游安装教程第三...
针对!鹤格娱乐辅助透视挂,兴动... 针对!鹤格娱乐辅助透视挂,兴动助手真的有挂,好像有挂细节一、兴动助手游戏安装教程牌型概率发牌机制”必...
随着!南星游戏辅助透视挂,无忧... 随着!南星游戏辅助透视挂,无忧确实有挂,总是有挂讲解进入游戏-大厅左侧-新手福利-激活码辅助透视技能...