标签:tmp 面试题 TreeNode 二叉 que new ----- 节点 04.09
题目表述
从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。
给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。
示例:
输入: root = [2,1,3]
**输出: **[[2,1,3],[2,3,1]]
**解释: **数组 [2,1,3]、[2,3,1] 均可以通过从左向右遍历元素插入树中形成以下二叉搜索树
2
/ \
1 3
回溯法
-
遍历数组,将元素逐个插入树中生成二叉搜索树的过程,可以反过来看成是遍历二叉搜索树的过程。每个节点只能前往它的左右子节点,不能直接到达孙子节点,且一棵树的根节点总是先于它的左右子树被插入到树中;
-
用一个双端队列deque来存储这次可以插入的候选节点,当队列中没有候选节点时,视为一种方案,存入结果数组中;
-
从队首取出,从队尾插入。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<List<Integer>> res = new ArrayList<>();
Deque<Integer> path = new LinkedList<>();
public List<List<Integer>> BSTSequences(TreeNode root) {
List<TreeNode> que = new LinkedList<>();
if(root != null){
que.add(root);
}
dfs(que);
return res;
}
public void dfs(List<TreeNode> que){
if(que.isEmpty()){
res.add(new ArrayList<>(path));
return;
}
List<TreeNode> copy = new LinkedList<>(que);
for(int i = 0; i < que.size();i++){
TreeNode tmp = que.get(i);
path.addLast(tmp.val);
que.remove(i);
if(tmp.left != null) que.add(tmp.left);
if(tmp.right != null) que.add(tmp.right);
dfs(que);
path.removeLast();
que = new LinkedList<>(copy);
}
}
}
标签:tmp,面试题,TreeNode,二叉,que,new,-----,节点,04.09 来源: https://www.cnblogs.com/youngerwb/p/16279086.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。