199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
/** * 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 { public List<Integer> rightSideView(TreeNode root) { List<Integer> a=new ArrayList<Integer>(); Deque<TreeNode> tree=new LinkedList<TreeNode>(); if(root!=null) tree.push(root); while(!tree.isEmpty()) { a.add(tree.peekFirst().val); int c=tree.size(); while(c>0) { if(tree.peekLast().left!=null) tree.push(tree.peekLast().left); if(tree.peekLast().right!=null) tree.push(tree.peekLast().right); tree.removeLast(); c--; } } return a; } }
个人总结: 解决问题的方法没想到,就时层级遍历,存入最右边的数。
113. 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
/** * 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 { List<List<Integer>> w=new ArrayList<List<Integer>>(); Deque<Integer> path=new LinkedList<Integer>(); public List<List<Integer>> pathSum(TreeNode root, int targetSum) { Deque<Integer> path=new LinkedList<Integer>(); p(root,targetSum); return w; } public void p(TreeNode root, int targetSum) { if(root==null) return; path.addLast(root.val); targetSum=targetSum-root.val; if(root.left==null&&root.right==null&&targetSum==0) { w.add(new LinkedList<Integer>(path)); } p(root.left,targetSum); p(root.right,targetSum); path.removeLast(); } }
个人总结: 当要注意确定节点时,用堆栈暂时存储前面的数据。
450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点; 如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
5 / \ 3 6 / \ \ 2 4 7
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
5 / \ 4 6 / \ 2 7
另一个正确答案是 [5,2,6,null,4,null,7]。
5 / \ 2 6 \ \ 4 7
/** * 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 { public int la(TreeNode root) { if(root.left==null) return root.val; return la(root.left); } public int pre(TreeNode root) { if(root.right==null) return root.val; return la(root.right); } public TreeNode deleteNode(TreeNode root, int key) { if(root==null) return null; if(key>root.val) root.right=deleteNode(root.right,key); if(key<root.val) root.left=deleteNode(root.left,key); if(key==root.val) { if(root.left==null&&root.right==null) root=null; else if(root.right!=null) { root.val=la(root.right); root.right=deleteNode(root.right,root.val); }else{ root.val=pre(root.left); root.left=deleteNode(root.left,root.val); } } return root; } }
个人总结: 不太会,拓展了思路,更加了解对二叉搜索树的操作。