3.25-3.26 leetcode总结
作者:互联网
2021
3
3.25
lc199 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
自己想法:利用二叉树的层序遍历,每次遍历一层的最后一个节点就将他加入返回的数组
public List<Integer> rightSideView(TreeNode root) {
//层序遍历??? lc199
List<Integer> res = new ArrayList<>();
if(root == null){
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
int size = queue.size();//层序遍历先确定每一层有多少个节点
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
if(i==size-1) res.add(node.val);//这里size-1就是这一层的最后一个元素
}
}
return res;
}
lc222 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
首先可以利用二叉树的遍历求得所有节点时间复杂度为O(n),但是利用完全二叉树的性质可以简化。
二叉树决定了左不满则右为空,可以利用二分查找
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
int left = countLevel(root.left);
int right = countLevel(root.right);
System.out.println(left+" "+right);
if(left == right){
return countNodes(root.right) + (1<<left);
}else{
return countNodes(root.left) + (1<<right);
}
}
private int countLevel(TreeNode root){
int level = 0;
while(root != null){
level++;
root = root.left;
}
return level;
}
lc17
3.26
lc257 二叉树的所有路径 递归
public List<String> binaryTreePaths(TreeNode root) {
// lc257二叉树的所有路径
// if(root==null){
// return null;
// }
// List<String> ans = new ArrayList<>();
// StringBuffer sb = new StringBuffer();
// sb = (StringBuffer)(root.val);
// StringBuffer left =
List<String> paths = new ArrayList<>();
constructPaths(root,"",paths);
return paths;
}
public void constructPaths(TreeNode root,String path,List<String> paths){
if(root!=null){
StringBuffer pathSB = new StringBuffer(path);
pathSB.append(Integer.toString(root.val));
if(root.left==null&&root.right==null){
paths.add(pathSB.toString());
}else {
pathSB.append("->");
constructPaths(root.left,pathSB.toString(),paths);
constructPaths(root.right,pathSB.toString(),paths);
}
}
}
lc113 求路径总和(到叶节点)
lc473 求根节点到叶节点数字之和
class Solution {
int ans = 0;
public int sumNumbers(TreeNode root) {
//lc129
find(root,0);
return ans;
}
public void find(TreeNode root,int sum){
if(root==null){
return;
}
if(root.left==null&&root.right==null){
sum = sum*10+ root.val;
ans+=sum;
}
find(root.left,sum*10+ root.val);
find(root.right,sum*10+ root.val);
}
}
标签:right,return,3.25,二叉树,3.26,null,root,leetcode,left 来源: https://www.cnblogs.com/zengxy99/p/14587986.html