面试经典150题(67-71)

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 ,树中每个节点都存放有一个 09 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 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的周赛。。好难和我刷的根本不是一个题啊。。

哎,这几天真的是越来越懒了没一点劲啊。。。。加油吧,早日跳槽!!!

你可能感兴趣的:(面试经典,150,题,面试,算法,职场和发展,leetcode,数据结构)