leetcode演算法題解(Java版)-12-中序遍歷

kissjz發表於2018-05-18

日子又恢復正常了,浪了半個月。。。
還是學習的時候感覺好~~

一、動態規劃

題目描述

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;
            }
        }
    }
}


相關文章