分类标签归档:Java

java算法-不分行从上到下打印二叉树


题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

解法

先将根节点进入队列。

队头元素出队,将值存入 list,判断该元素是否有左/右子树,有的话依次进入队列中。队列为空时结束。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @author bingo
 * @since 2018/11/23
 */

/**
 public class TreeNode {
 int val = 0;
 TreeNode left = null;
 Tre...

阅读全文...

java算法-把二叉树打印成多行


题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

解法

与上一题类似,只不过需要用变量记录每一层要打印多少个节点。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @author bingo
 * @since 2018/11/23
 */

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
...

阅读全文...

java算法-包含min函数的栈


题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

解法

定义两个stack

压栈时,先将元素node压入stack1。然后判断stack2的情况:

  • stack2栈为空或者栈顶元素大于node,则将node压入stack2中。
  • stack2栈不为空且栈定元素小于node,则重复压入栈顶元素。

获取最小元素时,从stack2中获取栈顶元素即可。

import java.util.Stack;

/**
 * @author bingo
 * @since 2018/11/22
 */


public class Solu...

阅读全文...

java算法-栈的压入、弹出序列


题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

解法

判断下一个要弹出的元素:

  • 如果刚好是栈顶元素,直接弹出。
  • 如果不在栈顶,则把压栈序列中还没有入栈的数字压入栈,直到待弹出的数字压入栈顶。
  • 如果所有数字都压入栈顶后依然没有后找到下一个弹出的数字,则不可能是弹出序列。
import java.util.Stack;

/*...

阅读全文...

java算法-顺时针打印矩阵


题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵:

1   2   3   4
5   6   7   8
9   10  11  12
13  14  15  16

则依次打印出数字:

1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解法

由外往里,一圈圈打印矩阵即可。

import java.util.ArrayList;

/**
 * @author bingo
 * @since 2018/11/22
 */

public class Solution {
    /**
     *...

阅读全文...

java算法-对称的二叉树


题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

解法

比较二叉树的前序遍历序列和对称前序遍历序列是否一样,若是,说明是对称的。

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = v...

阅读全文...

java算法-树的子结构


题目描述

输入两棵二叉树AB,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

解法

递归方式遍历:

  • 在树A中找到和树B的根结点值一样的结点R
  • 判断树A以R为根结点的子树是否包含与树B一样的结构
/**
 * @author bingo
 * @since 2018/11/22
 */

/*
 public class TreeNode {
 int val = 0;
 TreeNode left = null;
 TreeNode right = null;

 public TreeNode(int val) {
 this.val = val;

 }
...

阅读全文...

java算法-二叉树的镜像


题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。

源二叉树
            8
           /  \
          6   10
         / \  / \
        5  7 9 11

镜像二叉树
            8
           /  \
          10   6
         / \  / \
        11 9 7  5

解法

将根结点的左右孩子互换,之后递归左右孩子。

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
 public class Tr...

阅读全文...

java算法-反转链表


题目描述

输入一个链表,反转链表后,输出新链表的表头。

解法

解法一

利用头插法解决。

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    /**
     * 反转链表
     * @param head 链表头部
     * @retur...

阅读全文...

java算法-合并两个排序的链表


题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解法

解法一

同时遍历两链表进行 merge

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    /**
     * 合并两个排序链表
 ...

阅读全文...