您的位置:首页 > 其它

95. 不同的二叉搜索树 II(来源LeetCode)

2018-12-18 09:33 441 查看

给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。

示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]

思路:确定一个i,以i为界,将序列分为两部分(左右子树),再采用递归的方法继续分左右子树,最后采用左右子树组合的方法生成全部二叉查找树。
代码如下:

import java.util.*;
public class Solution95 {
public static List<TreeNode> generateTrees(int n) {    //判断n是否为0
// write your code here
if(n==0){
List<TreeNode> R = new LinkedList<TreeNode>();
R.add(null);
return R;
}
return generateTrees(1,n);
}
private static TreeNode copy(TreeNode Old){  //复制一个节点
if(Old==null)
return null;
TreeNode T = new TreeNode(Old.val);
T.right = copy(Old.right);
T.left = copy(Old.left);
return T;
}
static List<TreeNode> generateTrees(int start, int last){
if(start>last)
return null;
List<TreeNode> result = new LinkedList<TreeNode>();  //树节点链表,包含众多左右子树
for(int i=start;i<=last;++i){
TreeNode root = new TreeNode(i);
List<TreeNode> left = generateTrees(start,i-1);   //生成左子树
List<TreeNode> right = generateTrees(i+1,last);  //生成右子树
if(left==null&&right==null)   //若左右子树为空,则将根节点添加到节点链表result
result.add(root);
else if(left==null){         //若左子树为空,将右子树添加到节点链表result
for(TreeNode R:right){
root.right = R;
result.add(copy(root));
}
}
else if(right==null){          //若右子树为空,将左子树添加到节点链表result
for(TreeNode L:left){
root.left = L;
result.add(copy(root));
}
}
else{
for(TreeNode L:left)      //若左右子树均不为空,则将左右子树与跟节点进行组合
for(TreeNode R:right){
root.left = L;
root.right = R;
result.add(copy(root));     // 返回一颗树或者另一颗树的子树
}
}
}
return result;
}
private static void printTree(TreeNode t){        //采用先序遍历的方式打印一棵树
if(t != null){
System.out.println(t.val);
printTree(t.left);
printTree(t.right);
}
}
public static void main(String []args){
List<TreeNode> a = generateTrees(5);   //a为树列表
for(int i = 0; i < a.size(); i++) {
printTree(a.get(i));
System.out.println();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: