二叉搜索树序列

利用动态的dfs完成算法:

注意点:我在代码中进行了两次list复制,为什么这么处理呢?

result2的复制是为了防止后面被result修改的时候被同步修改。

list2的复制是因为外层在for循环list的值,这时候对list进行修改会影响for循环的操作

package cn.tiger.funny;

import java.util.ArrayList;
import java.util.List;

// Definition for a binary tree node.
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

/**
 * 二叉搜索树序列
 * @author jyuan
 *
 从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树,输出所有可能生成此树的数组。
示例:
给定如下二叉树

        2
       / \
      1   3
返回:

[
   [2,1,3],
   [2,3,1]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bst-sequences-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class BSTSequence {
    List<List<Integer>> results = new ArrayList<List<Integer>>();
    public List<List<Integer>> BSTSequences(TreeNode root) {
        if(root==null) {
            return results;
        }
        List<TreeNode> list = new ArrayList<TreeNode>();
        list.add(root);
        List<Integer> result = new ArrayList<Integer>();
        dfs(list, result);
        return results;
    }
    
    private void dfs(List<TreeNode> list, List<Integer> result) {
        List<TreeNode> list2 = new ArrayList<TreeNode>(list);
        if(list.isEmpty()) {
            List<Integer> result2 = new ArrayList<Integer>(result);
            results.add(result2);
            return;
        }
        for (TreeNode treeNode : list) {
            list2.remove(treeNode);
            if(treeNode.left != null) {
                list2.add(treeNode.left);
            }
            if(treeNode.right != null) {
                list2.add(treeNode.right);
            }
            result.add(treeNode.val);
            dfs(list2, result);
            result.remove((Integer)treeNode.val);
            list2.add(treeNode);
            if(treeNode.left != null) {
                list2.remove(treeNode.left);
            }
            if(treeNode.right != null) {
                list2.remove(treeNode.right);
            }
        }
    }
}

 

 

posted @ 2021-01-25 20:32  预言2018  阅读(119)  评论(0)    收藏  举报