码迷,mamicode.com
首页 > 其他好文 > 详细

树 -二叉树-二叉搜索树-递归

时间:2020-04-20 17:35:47      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:最短路   字符串   使用   示例   无法   post   sem   first   百度   

参考网址: https://visualgo.net/zh/bst?slide=1

  二叉树的  前序遍历 中序遍历 后序遍历

  n叉树的 前序遍历  后序遍历

  n叉树的层序遍历

// 二叉树的  前序遍历
class
Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); helper(res,root); return res; } public void helper(List<Integer> res,TreeNode root){ if(root==null) return; res.add(root.val); helper(res,root.left); helper(res,root.right); } }
/* n叉树后序遍历
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<Integer> postorder(Node root) {
        List<Integer> res = new ArrayList<>();
        helper(res,root);
        return res;
    }
    public void helper(List<Integer> res,Node root){
        if(root==null) return;
        for(Node node : root.children){
             helper(res,node);
        }
        res.add(root.val);
    }
}

 

/*N叉树的层序遍历
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root ==null) return res;
        List<Node> curLevel = new ArrayList<>();
        if(root !=null) curLevel.add(root);
        while(curLevel.size()!=0){
            List<Integer> curLevelVals = new ArrayList<>();
            List<Node> nextLevel = new ArrayList<>();
            for(Node node:curLevel){
                curLevelVals.add(node.val);
                nextLevel.addAll(node.children);
            }
            res.add(curLevelVals);
            curLevel = nextLevel;
        }
        return res;
    }
}

Queue -API


boolean add(E e) :将指定的元素插入到此队列中如果当前没有可用空间,则抛出IllegalStateException。 不建议
boolean offer(E e):如果在不违反容量限制的情况下立即执行,则将指定的元素插入到此队列中。

E peek():检索但不删除此队列的头,如果此队列为空,则返回 null 。
E element() :检索,但不删除,这个队列的头。

E poll():检索并删除此队列的头,如果此队列为空,则返回 null 。
E remove():检索并删除此队列的头。 不建议

java中定义队列 一般这样定义: Queue<E> queue = new LinkedList<E>();
当采用LinkedList来实现时,api的使用和对用关系如下:

队列方法 等效方法
offer(e) offer(e)/offerLast(e) //进队列,将元素加入队列末尾
poll() poll()/pollFirst() //获取队列头的元素并移除
peek() peek()/peekFirst() //获取队列头的元素
isEmpty() //判断是否为空 
 

 

递归

public void recur(int level, int param) { 
  // 1递归终止条件
  // 2处理当前层逻辑
  process(level, param); 
  // 3递归到下一层
  recur( level: level + 1, newParam); 
  // 4保存当前层状态
}
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

技术图片

示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。 (递归考虑pq的分布)

 

105. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   /   9  20
    /     15   7

 思路: 循环 切分数组 构建左右子树
 Arrays.copyOfRange(arr,from,to) 前闭后开;
 优化:使用临时变量保存,可以节省内存使用;
111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   /   9  20
    /     15   7
返回它的最小深度  2.
思路: 枚举 画图
297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例: 

你可以将以下二叉树:

    1
   /   2   3
     /     4   5

序列化为 "[1,2,3,null,null,4,5]"

 

77. 组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
思路:
  
46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
思路:
47. 全排列 II
给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]
思路:
50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
思路: 分治 折半 快速幂
78. 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]
思路:
169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

 

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2
思路:
17. 电话号码的字母组合(排列问题)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
技术图片
示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:

51. N皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
技术图片
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q‘ 和 ‘.‘ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],
 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
思路:回溯
433. 最小基因变化
一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 "A", "C", "G", "T"中的任意一个。

假设我们要调查一个基因序列的变化。一次基因变化意味着这个基因序列中的一个字符发生了变化。

例如,基因序列由"AACCGGTT" 变化至 "AACCGGTA" 即发生了一次基因变化。

与此同时,每一次基因变化的结果,都需要是一个合法的基因串,即该结果属于一个基因库。

现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。

注意:

起始基因序列默认是合法的,但是它并不一定会出现在基因库中。
所有的目标基因序列必须是合法的。
假定起始基因序列与目标基因序列是不一样的。
示例 1:
start: "AACCGGTT"
end:   "AACCGGTA"
bank: ["AACCGGTA"]
返回值: 1
示例 2:
start: "AACCGGTT"
end:   "AAACGGTA"
bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"]
返回值: 2
思路:
  

 

树 -二叉树-二叉搜索树-递归

标签:最短路   字符串   使用   示例   无法   post   sem   first   百度   

原文地址:https://www.cnblogs.com/hoper2020/p/12739157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!