leetcode 150道题 计划花两个月时候刷完,今天(第三十四天)完成了5道(67-71)150:
67.(114. 二叉树展开为链表)题目描述:
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
第一版(这个主要是要会写先序遍历《根左右》非递归,先序遍历非递归就是先将头节点加入栈中,然后栈不为空,取出栈顶(就是输出根元素了),右节点部位空先放右节点,再放左节点)
class Solution {
public void flatten(TreeNode root) {
if(root==null){
return ;
}
Stack<TreeNode> stack=new Stack();
TreeNode dumpNode=root;
stack.push(dumpNode);
boolean flag=false;
while(!stack.isEmpty()){
TreeNode temp= stack.pop();
if(temp.right!=null){
stack.push(temp.right);
}
if(temp.left!=null){
stack.push(temp.left);
}
if(flag){
dumpNode.right=temp;
dumpNode=dumpNode.right;
}
temp.left=null;
flag=true;
}
}
}
68.(112. 路径总和)题目描述:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
第一版(我用的深度优先,然后递归)
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null){
return false;
}
if(root.left==null&&root.right==null&&root.val==targetSum){
return true;
}
return hasPathSum(root.left,targetSum-root.val)||hasPathSum(root.right,targetSum-root.val);
}
}
69.(129. 求根节点到叶节点数字之和)题目描述:
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
第一版(和上面那个题是差不多的,我也是改了一下上一个代码)
class Solution {
public int sumNumbers(TreeNode root) {
if(root==null){
// 这块搞了好一会
return 0;
}
int sum=0;
return dfs(root,sum);
}
public int dfs(TreeNode root,int sum) {
if(root==null){
return 0;
}
if(root.left==null&&root.right==null){
return sum*10+root.val;
}
return dfs(root.left,sum*10+root.val)+dfs(root.right,sum*10+root.val);
}
}
70.(173. 二叉搜索树迭代器)题目描述:
实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:
BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
int next()将指针向右移动,然后返回指针处的数字。
第一版(先把中序遍历结果存起来,然后再计算)
class BSTIterator {
List<TreeNode> list;
int index=0;
public BSTIterator(TreeNode root) {
index=0;
list=new ArrayList();
if(root==null){
return ;
}
Stack<TreeNode> stack=new Stack();
while(!stack.isEmpty()||root!=null){
while(root!=null){
stack.push(root);
root=root.left;
}
root=stack.pop();
list.add(root);
root=root.right;
}
}
public int next() {
return list.get(index++).val;
}
public boolean hasNext() {
return index<list.size();
}
}
第二版(看了解题,把中序遍历算法拆开了。。写了一下但是感觉不好理解,但是很强)
class BSTIterator {
Stack<TreeNode> stack;
TreeNode currNode;
public BSTIterator(TreeNode root) {
stack=new Stack();
currNode=root;
}
public int next() {
while(currNode!=null){
stack.push(currNode);
currNode=currNode.left;
}
currNode= stack.pop();
int res=currNode.val;
currNode=currNode.right;
return res;
}
public boolean hasNext() {
return !stack.isEmpty()||currNode!=null;
}
}
71.(222. 完全二叉树的节点个数)题目描述:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
第一版(完全没用上 完全二叉树的定义。。)
class Solution {
int sum=0;
public int countNodes(TreeNode root) {
if(root==null){
return 0;
}
sum++;
countNodes(root.right);
countNodes(root.left);
return sum;
}
}
这几天刷题刷出自信了,今天早上去试了一下leetcode的周赛。。好难和我刷的根本不是一个题啊。。
哎,这几天真的是越来越懒了没一点劲啊。。。。加油吧,早日跳槽!!!