leetcode演算法題解(Java版)-12-中序遍歷
日子又恢復正常了,浪了半個月。。。
還是學習的時候感覺好~~
一、動態規劃
題目描述
Given n, how many structurally unique BST`s (binary search trees) that store values 1…n?
For example,
Given n = 3, there are a total of 5 unique BST`s.
1 3 3 2 1
/ / /
3 2 1 1 3 2
/ /
2 1 2 3
思路
- 題目看上去像是二叉搜尋樹的題,實際上是動態規劃。給到1~n的數,要找出多少種二叉查詢樹,對於取值為k的數來說,在它左邊的又1~k-1,右邊的有k+1~n.所以可以把左子樹排列的種數乘右子樹的種數得到以這個為根的二叉查詢樹的個數。
- 用一個狀態陣列記錄下值。
程式碼
public class Solution {
public int numTrees(int n) {
if(n==0){
return 0;
}
int [] f = new int[n+1];
f[0]=1;
for(int i=1;i<=n;i++){//外迴圈,重新整理1,2,3,4.。。n的結果
for(int j=1;j<=i;j++){//小迴圈,計算各個的值
f[i]+=f[j-1]*f[i-j];
}
}
return f[n];
}
}
二、中序遍歷
題目描述
Given a binary tree, return the inorder traversal of its nodes` values.
For example:
Given binary tree{1,#,2,3},
1
2
/
3
return[1,3,2].
思路
- 二叉樹的中序遍歷,就是所謂的左-中-右。
- 遞迴和非遞迴方法,直接看程式碼!
程式碼
//遞迴
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> res=new ArrayList<Integer>();
if(root==null)return res;
inorder(root,res);
return res;
}
public static void inorder(TreeNode root, ArrayList<Integer> list){
if(root != null){
inorder(root.left,list);
list.add(root.val);
inorder(root.right,list);
}
}
}
//非遞迴
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
if(root==null){
return res;
}
while(!stack.isEmpty()||node!=null){
while(node!=null){
stack.add(node);
node = node.left;
}
node = stack.pop();
res.add(node.val);
node = node.right;
}
return res;
}
}
三、深搜
題目描述
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given”25525511135″,
return[“255.255.11.135”, “255.255.111.35”]. (Order does not matter)
思路
- 深度搜尋+回溯的時候剪枝
程式碼
import java.util.ArrayList;
public class Solution {
public ArrayList<String> restoreIpAddresses(String s) {
ArrayList<String> res =new ArrayList<String>();
ArrayList<String> ip =new ArrayList<String>();
int start = 0 ;
dfs(s,res,ip,start);
return res;
}
public void dfs(String s,ArrayList<String> res,ArrayList<String> ip,int start){
if(ip.size()==4&&start==s.length()){
res.add(ip.get(0)+`.`+ip.get(1)+`.`+ip.get(2)+`.`+ip.get(3));
}
if(s.length()-start > 3*(4-ip.size())){//剪枝
return ;
}
if(s.length()-start+1 < 4-ip.size()){//剪枝
return ;
}
int num = 0 ;
for(int i=start;i<start+3&&i<s.length();i++){
num = num*10+(s.charAt(i)-`0`);
if(num<0||num>255){
return ;
}
ip.add(s.substring(start,i+1));
dfs(s,res,ip,i+1);
ip.remove(ip.size()-1);
if(num==0){//可以新增0,但不允許有字首為0的
break;
}
}
}
}
相關文章
- Leetcode 演算法題解系列 - 二叉樹的層序遍歷LeetCode演算法二叉樹
- LeetCode 熱題 HOT 100 Java題解——94. 二叉樹的中序遍歷LeetCodeJava二叉樹
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- Leetcode——94.二叉樹的中序遍歷LeetCode二叉樹
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- Leetcode145. Morris後序遍歷LeetCode
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- 【模板題】- 94. 二叉樹的中序遍歷二叉樹
- ast 後序遍歷AST
- 力扣#94 樹的中序遍歷力扣
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- 二叉樹中序和後序遍歷表示式二叉樹
- js物件遍歷順序JS物件
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- Java中Map的遍歷方法Java
- LintCode 前序遍歷和中序遍歷樹構造二叉樹二叉樹
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 關於二叉樹的前序遍歷、中序遍歷、刪除元素、插入元素二叉樹
- JavaScript 中的遍歷詳解JavaScript
- 遍歷檔案Java中遍歷出指定目錄中的所有檔案Java
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- Leetcode 590. N叉樹的後序遍歷(DAY 2)LeetCode
- 刷題系列 - 中序和後序遍歷佇列,構造對應二叉樹;佇列二叉樹
- 【樹01】對二叉樹前序/中序/後序遍歷演算法的一些思考二叉樹演算法
- “馬的遍歷”問題的貪婪法解決演算法演算法
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 從中序與後序遍歷序列構造二叉樹二叉樹