面试题 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); } } }

__EOF__

本文作者Younger
本文链接https://www.cnblogs.com/youngerwb/p/16279086.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   YoungerWb  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示