刷Leetcode 144题的时候,遇到一个精简的数组(父节点为null),以此生成二叉树,进行前序遍历。因为二叉树生成不许需要编码,leetcode后台生成。但是,如果我能用代码把这个二叉树构建出来的话,,不管是前序/中序还是后续,都能随心所欲了。于是试着构建这个二叉树。为了方便理解,精简的数组构建成了完全二叉树(不是满二叉树),null节点的子节点也补全为null。
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
二叉树类结构:
class TreeNode<T> {
public T val;
public TreeNode left;
public TreeNode right;
public TreeNode(T val) {
this.val = val;
}
}
生成一棵二叉树,使用LinkedList存储节点,方便补全为完全二叉树。
public static <T> TreeNode buildBinaryTree(T[] arr) {
//使用LinkedList,方便补全null
List<TreeNode> linkedList = new LinkedList<>();
if (arr.length < 1) return null;
int len = arr.length;
for (int i = 0; i < len; i++) {
if (arr[i] == null) linkedList.add(null);
else linkedList.add(new TreeNode(arr[i]));
}
//i树的索引,最高二叉树高度是n/2+1
for (int i = 0; i <= linkedList.size() / 2 - 1; i++) {
//父节点为null,就没有子节点
if (linkedList.get(i) == null) {
//父节点为null,需要在链表合适位置(2i+1,2i+2)处补上null作为子节点
linkedList.add(2 * i + 1, null);
linkedList.add(2 * i + 2, null);
continue;
}
// 左结点是否为空,左节点是否被列出
if ((2 * i + 1) < linkedList.size() && linkedList.get(2 * i + 1) != null) {
linkedList.get(i).left = linkedList.get(2 * i + 1);
double db = Math.log((linkedList.size() / Math.log(2)));
int depth = new BigDecimal(db).intValue();
}
//右节点是否为空,右节点是否被列出
if ((2 * i + 2) < linkedList.size() && linkedList.get(2 * i + 2) != null) {
linkedList.get(i).right = linkedList.get(2 * i + 2);
}
}
return linkedList.get(0);
}
递归方法前序遍历二叉树:
public static <T> List<T> preorderTraversal(TreeNode<T> root, List<T> resultList) {
if (root==null){
return resultList;
}
resultList.add(root.val);
preorderTraversal(root.left, resultList);
preorderTraversal(root.right, resultList);
return resultList;
}
测试方法:
public static void main(String[] args) {
Integer[] arr = new Integer[]{1, null, 2, 3};
// Character[] chars = new Character[]{'A', 'B','C','D','E','F','G'};
TreeNode root = buildBinaryTree(arr);
List<Integer> resultList = new ArrayList<>();
System.out.println(preorderTraversal(root, resultList));
}
二叉树的前中后序遍历请参考:https://www.jianshu.com/p/456af5480cee,大神写的很详细了,膜拜