[Modified post-order traversal algorithm] 95. Different binary search trees II

95. Different Binary Search Trees II

Problem-solving ideas

  • Traverse each node
  • View the binary search tree with k as the root node
  • Store the root nodes of all left subtrees
  • Store the root nodes of all right subtrees
  • Assemble the left and right subtrees and store the root node in a vector
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public List<TreeNode> generateTrees(int n) {
    
    
        if(n < 1) return generate(1,0);

        return generate(1,n);
    }


    List<TreeNode> generate(int start,int end){
    
    
        List<TreeNode> subTree = new ArrayList<>();// 储存所有的根节点

        if(start > end){
    
    
            subTree.add(null);
            return subTree;
        }

        // 查找以k为根节点的二叉搜索树
        for(int k = start; k <= end; k++){
    
    
            // 储存所有左子树的根节点
            List<TreeNode> left = generate(start,k - 1);

            // 储存所有右子树的根节点
            List<TreeNode> right = generate(k + 1,end);


            // 将左子树和右子树组装起来  将根节点储存在向量中
            for(int i = 0; i < left.size(); i++){
    
    

                for(int j = 0; j < right.size(); j++){
    
    
                    TreeNode root = new TreeNode(k);// 新建一个节点

                    root.left = left.get(i);
                    root.right = right.get(j);

                    subTree.add(root);
                }
            }


        }

        return subTree;
    }
}

Guess you like

Origin blog.csdn.net/qq_44653420/article/details/133553988