---
# System prepended metadata

title: 386. 字典序排数 DFS深度優先 模板【Medium】【DFS】

---

# 386. 字典序排数 DFS深度優先 模板【Medium】【DFS】

DFS模板
dfs是一種遞迴，所以要設定遞迴的終止條件，且方法互相call時，要做事，才有意義。
1. Base case
    Do something
    Recurse for subproblems
    
General steps:
1. Base Case **(Leaf)**
2. 利用父問題傳下來的值做一些計算 **(parent node multiple 10 and add node val) cur = cur*10+node.val < limit**
3. 若有必要，做一些額外操作
4. 返回答案(給父問題) **dfs(cur, limit)**

![](https://i.imgur.com/1uZIPnY.png)
    
```java=
public void dfs(TreeNode node){
    if(node == null){
        return;
    }
    System.out.println(node.val);
    dfs(node.left);
    dfs(node.right);
}

```

给你一个整数 n ，按字典序返回范围 [1, n] 内所有整数。

你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。

 

示例 1：

```
输入：n = 13
输出：[1,10,11,12,13,2,3,4,5,6,7,8,9]
```
示例 2：

```
输入：n = 2
输出：[1,2]
```
 

題解思路：
將[1,n]的數按照字典序加入到答案，本質上是對一顆節點數量為n，類型類似字典樹的多階樹進行遍歷。
根節點是0，所以需要跳過，可以從樹的第二層開始搜索

```java=
class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> lexicalOrder(int n) {
        for(int i=1;i<=9;i++){
            dfs(i, n);
        }
        return ans;
    }
    void dfs(int cur, int limit){
        if(cur>limit) return;
        ans.add(cur);
        for(int i=0;i<=9;i++){
            dfs(cur*10+i, limit);
        }
    }
}

```

