• 二叉树的前序遍历

  • 我的解法:利用递归,自底向下逐步添加到list,返回最终的前序遍历list

    class Solution {

    public List<Integer> preorderTraversal(TreeNode root) {

    List<Integer> list=new ArrayList<>();

    if (root==null) {

    return list;

    }

    list.add(root.val);

    if (root.left!=null) {

    list.addAll(preorderTraversal(root.left));

    }

    if (root.right!=null) {

    list.addAll(preorderTraversal(root.right));

    }

    return list;

    }

    }

  • 参考解法:利用递归,但只在外部建一个list,更好理解!

    class Solution {

    public List<Integer> list=new LinkedList<>();

    public List<Integer> preorderTraversal(TreeNode root) {

    if (root==null)

    return list;

    list.add(root.val);

    preorderTraversal(root.left);

    preorderTraversal(root.right);

    return list;

    }

    }

  • 中序遍历二叉树,同样有两种方法

  • 第一种

    class Solution {

    public List<Integer> inorderTraversal(TreeNode root) {

    List<Integer> list=new ArrayList<>();

    if (root==null) {

    return list;

    }

    if (root.left!=null) {

    list.addAll(inorderTraversal(root.left));

    }

    list.add(root.val);

    if (root.right!=null) {

    list.addAll(inorderTraversal(root.right));

    }

    return list;

    }

    }

  • 第二种

    class Solution {

    List<Integer> list=new ArrayList<>();

    public List<Integer> inorderTraversal(TreeNode root) {

    if (root==null) {

    return list;

    }

    inorderTraversal(root.left);

    list.add(root.val);

    inorderTraversal(root.right);

    return list;

    }

    }

  • 后序遍历二叉树:也有两种方法,和前面的差不多,所以只写简洁的

    class Solution {

    List<Integer> list=new ArrayList<>();

    public List<Integer> postorderTraversal(TreeNode root) {

    if (root==null) {

    return list;

    }

    postorderTraversal(root.left);

    postorderTraversal(root.right);

    list.add(root.val);

    return list;

    }

    }

  • 层次遍历二叉树

  • 队列解法:

    class Solution {

    public List<List<Integer>> levelOrder(TreeNode root) {

    List<List<Integer>> res=new ArrayList<>();

    if (root==null) {

    return res;

    }

    Queue<TreeNode> queue=new LinkedList<>();

    queue.add(root);

    while (!queue.isEmpty()) {

    int count=queue.size();

    List<Integer> list=new LinkedList<>();

    while (count>0) {

    TreeNode node=queue.poll();

    list.add(node.val);

    if (node.left!=null) {

    queue.add(node.left);

    }

    if (node.right!=null) {

    queue.add(node.right);

    }

    count--;

    }

    res.add(list);

    }

    return res;

    }

    }

  • 递归解法:参考大神的代码!!!

    class Solution {

    public List<List<Integer>> levelOrder(TreeNode root) {

    List<List<Integer>> res=new ArrayList<>();

    if (root==null) {

    return res;

    }

    addList(res, 0, root);

    return res;

    }

    private void addList(List<List<Integer>> res,int level,TreeNode head) {

    if (head==null) {

    return;

    }

    if (res.size()<=level) { //这里有个问题,如果不是等于的话

    res.add(new ArrayList<>());

    }

    res.get(level).add(head.val);//这里的将会越界,因为level=res.size()取不到

    addList(res, level+1, head.left);

    addList(res, level+1, head.right);

    }

    }

  • 二叉树的最大深度

  • 递归

    class Solution {

    public int maxDepth(TreeNode root) {

    if (root==null) {

    return 0;

    }

    int leftH=maxDepth(root.left);

    int rightH=maxDepth(root.right);

    return Math.max(leftH, rightH)+1;

    }

    }

  • 迭代

这个方法太难了,不优先考虑!!

class Solution {

public int maxDepth(TreeNode root) {

Queue<Pair<TreeNode,Integer>> queue=new LinkedList<>();

if (root!=null) {

queue.add(new Pair<TreeNode, Integer>(root, 1));

}

int depth=0;

while (!queue.isEmpty()) {

Pair<TreeNode,Integer> pair=queue.poll();

root=pair.getKey();

int pair_depth=pair.getValue();

if (root!=null) {

depth=Math.max(depth, pair_depth);

queue.add(new Pair<TreeNode, Integer>(root.left, pair_depth+1));

queue.add(new Pair<TreeNode, Integer>(root.right, pair_depth+1));

}

}

return depth;

}

}

  • 对称二叉树

  • 递归

    class Solution {

    public boolean isSymmetric(TreeNode root) {

    return isMirror(root, root);

    }

    private boolean isMirror(TreeNode t1,TreeNode t2) {

    if (t1==null&&t2==null) {

    return true;

    }

    if (t1==null||t2==null) {

    return false;

    }

    return (t1.val==t2.val)&&isMirror(t1.left, t2.right)

    &&isMirror(t1.right,t2.left);

    }

    }

  • 迭代

    class Solution {

    public boolean isSymmetric(TreeNode root) {

    Queue<TreeNode> queue=new LinkedList<>();

    if (root==null||(root.left==null&&root.right==null)) {

    return true;

    }

    queue.add(root.left);

    queue.add(root.right);

    while (!queue.isEmpty()) {

    TreeNode t1=queue.poll();

    TreeNode t2=queue.poll();

    if (t1==null&&t2==null) continue;

    if(t1==null||t2==null) return false;

    if(t1.val!=t2.val) return false;

    queue.add(t1.left);

    queue.add(t2.right);

    queue.add(t1.right);

    queue.add(t2.left);

    }

    return true;

    }

    }

  • 路径总和:递归很简洁

    class Solution {

    public boolean hasPathSum(TreeNode root, int sum) {

    if (root==null) {

    return false;

    }

    if (root.left==null&&root.right==null) {

    return sum-root.val==0;

    }

    return hasPathSum(root.right, sum-root.val)||

    hasPathSum(root.left, sum-root.val);

    }

    }

  • 验证二叉搜索树

  • 利用中序遍历法:简单易懂

    class Solution {

    public boolean isValidBST(TreeNode root) {

    if (root==null) {

    return true;

    }

    List<Integer> list=new ArrayList<>();

    inOrder(root, list);

    for (int i = 0; i < list.size()-1; i++) {

    if (list.get(i+1)<=list.get(i)) {

    return false;

    }

    }

    return true;

    }

    private void inOrder(TreeNode node,List<Integer> list) {

    if (node==null) {

    return;

    }

    inOrder(node.left, list);

    list.add(node.val);

    inOrder(node.right, list);

    }

    }

  • 大神递归法:

    class Solution {

    double last=-Double.MAX_VALUE;

    public boolean isValidBST(TreeNode root) {

    if (root==null) {

    return true;

    }

    if (isValidBST(root.left)) {

    if (last<root.val) {

    last=root.val;

    return isValidBST(root.right);

    }

    }

    return false;

    }

    }

  • 堆桟法

    public boolean isValidBST(TreeNode root) {

    Stack<TreeNode> stack = new Stack();

    TreeNode p = root;

    Integer preVal = null ;

    while( p != null || !stack.isEmpty() ){

    if(p != null){

    stack.push(p);

    p = p.left;

    }else{

    p = stack.pop();

    int val = p.val;

    if(preVal == null){

    preVal = val;

    }else{

    if(val <= preVal){

    return false;

    }

    preVal = val;

    }

    p = p.right;

    }

    }

    return true;

    }

  • 将有序数组转换为二叉搜索树

  • 解法一

    class Solution {

    public TreeNode sortedArrayToBST(int[] nums) {

    return buildBST(nums, 0, nums.length-1);

    }

    private TreeNode buildBST(int[] nums,int l,int r) {

    if (l>r) {

    return null;

    }

    if (l==r) {

    return new TreeNode(nums[l]);

    }

    int mid=(r+l)/2;

    TreeNode root=new TreeNode(nums[mid]);

    root.left=buildBST(nums, l, mid-1);

    root.right=buildBST(nums, mid+1, r);

    return root;

    }

    }

  • 总结:递归是万能的,但递归真的很恶心!!!

算法练习LeetCode初级算法之树的更多相关文章

  1. 【LeetCode算法】LeetCode初级算法——字符串

      在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...

  2. 算法练习LeetCode初级算法之链表

    删除链表中的节点 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ne ...

  3. 算法练习LeetCode初级算法之字符串

    反转字符串 我的解法比较low,利用集合的工具类Collections.reverse反转,用时过长 class Solution { public void reverseString(char[] ...

  4. 算法练习LeetCode初级算法之数组

    删除数组中的重复项 官方解答: 旋转数组 存在重复元素 只出现一次的数     官方解答:  同一个字符进行两次异或运算就会回到原来的值 两个数组的交集 II import java.util.Arr ...

  5. 算法练习LeetCode初级算法之其他

    位1的个数 解法一: class Solution { // you need to treat n as an unsigned value public int hammingWeight(int ...

  6. 算法练习LeetCode初级算法之数学

    Fizz Buzz class Solution { public List<String> fizzBuzz(int n) { List<String> list=new L ...

  7. 算法练习LeetCode初级算法之设计问题

    打乱数组 不断的让第一个与后面随机选择的数交换 class Solution { private int[] nums; private int[] initnums; public Solution ...

  8. 算法练习LeetCode初级算法之动态规划

    爬楼梯:斐波那契数列 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 非递归解法 class S ...

  9. 算法练习LeetCode初级算法之排序和搜索

    合并两个有序数组 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arrayco ...

随机推荐

  1. 2019西湖论剑网络安全技能大赛(大学生组)部分WriteUp

    这次比赛是我参加以来成绩最好的一次,这离不开我们的小团队中任何一个人的努力,熬了一整天才答完题,差点饿死在工作室(门卫大爷出去散步,把大门锁了出不去,还好学弟提了几个盒饭用网线从窗户钓上来才吃到了午饭 ...

  2. C++学习(三十七)(C语言部分)之 链式栈(推箱子实现)

    用链表实现栈一开始在表头插入,就要一直在表头插入一开始在表尾插入,就要一直在表头插尾表头当栈底 也可以把表尾当栈底 实现的测试代码笔记如下: #include<stdio.h> #incl ...

  3. MySQL:日期函数、时间函数总结(MySQL 5.X)

    http://www.cnblogs.com/she27/archive/2009/01/16/1377089.html 原文:http://www.51sdj.com/phpcms/picture/ ...

  4. 斐波那契数列中获取第n个数据值

    class Fibonacci { /** * Description:迭代方法获取fibonacci第n项数值 * * @param int $n * @return int */ public s ...

  5. memcached-redis

    http://www.runoob.com/memcached/memcached-cas.html https://github.com/memcached/memcached/blob/maste ...

  6. Java高级特性 第2节 java中常用的实用类(1)

    一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...

  7. nginx屏蔽某段IP、某个国家的IP

    nginx中可通过写入配置文件的方法来达到一定的过滤IP作用,可使用deny来写. deny的使用方法可用于前端服务器无防护设备的时候过滤一些异常IP,过滤的client ip会被禁止再次访问,起到一 ...

  8. jenkins中如何实现执行脚本时的变量共享

    1.主要是利用EnvInject Plugin插件,所以要首先安装插件,安装好后如下图: 2.然后在“增加构建步骤”中,插入一个“Execute Python script” 代码我用的python3 ...

  9. 执行sql语句为什么?用PreparedStatement要比Statement好用

    PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Stateme ...

  10. udev example -- detect usb and write test file

    之前学习了下Udev,就随便做了个测试小程序.....设计什么的也没考虑,就实现了一个基本功能,插入U盘,识别,循环检测到有特定文件后,就然后往U盘里面写数据,插拔多次,都能正常工作. 里面的warn ...