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 熱題 HOT 100 Java題解——94. 二叉樹的中序遍歷LeetCodeJava二叉樹
- Leetcode 演算法題解系列 - 二叉樹的層序遍歷LeetCode演算法二叉樹
- Leetcode145. Morris後序遍歷LeetCode
- Morris中序遍歷
- Leetcode——94.二叉樹的中序遍歷LeetCode二叉樹
- 非遞迴實現先序遍歷和中序遍歷遞迴
- 刷題筆記:樹的前序、中序、後序遍歷筆記
- 演算法 -- 實現二叉樹先序,中序和後序遍歷演算法二叉樹
- LeetCode-106-從中序與後序遍歷序列構造二叉樹LeetCode二叉樹
- 7-1 根據後序和中序遍歷輸出先序遍歷 (25 分)
- 【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現記錄(Java版)演算法二叉樹遞迴Java
- LeetCode102.二叉樹的層序遍歷LeetCode二叉樹
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 【模板題】- 94. 二叉樹的中序遍歷二叉樹
- 102、二叉樹的層序遍歷 | 演算法(leetcode,附思維導圖 + 全部解法)300題二叉樹演算法LeetCode
- ast 後序遍歷AST
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- 力扣#94 樹的中序遍歷力扣
- 二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法二叉樹遞迴演算法
- LeetCode-107-二叉樹的層序遍歷 IILeetCode二叉樹
- Leetcode 590. N叉樹的後序遍歷(DAY 2)LeetCode
- 程式碼隨想錄演算法訓練營day14 | leetcode 144. 二叉樹的前序遍歷、145. 二叉樹的後序遍歷、94. 二叉樹的中序遍歷演算法LeetCode二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- LeetCode-105-從前序與中序遍歷序列構造二叉樹LeetCode二叉樹
- leetcode演算法題解(Java版)-14-第k小數問題LeetCode演算法Java
- L2_006樹的遍歷(後序+中序->前序/層序)
- 二叉樹中序和後序遍歷表示式二叉樹
- js物件遍歷順序JS物件
- LeetCode 105. 從前序與中序遍歷序列構造二叉樹 | PytLeetCode二叉樹
- 【資料結構與演算法】二叉樹的 Morris 遍歷(前序、中序、後序)資料結構演算法二叉樹
- leetcode演算法題解(Java版)-7-迴圈連結串列LeetCode演算法Java
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 106. 從中序與後序遍歷序列構造二叉樹——Java實現二叉樹Java
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹