标题:Java实现前序,中序得到二叉树
其实把中序,后序的改一下递归调用的条件就行了
可以先了解Java实现通过中序,后序得到二叉树
/**
* 测试前中
* @author dell
*
*/
public class TestPreInOrder {
/**
*前中 使用递归
*执行用时:5 ms, 在所有 Java 提交中击败了28.63% 的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了96.02% 的用户
* @return
*/
public TreeNode preInOrder(Integer[] a, Integer[] b, int as, int ae, int bs, int be) {
if(as > ae || bs > be) {
return null;
}else {
TreeNode node = new TreeNode(b[bs]);
int i = 0;
for(;i <= ae; i++) {
if(a[i] == b[bs]) {
break;
}
}
node.left = this.preInOrder(a, b, as, i - 1, bs + 1, (bs + 1) + (i - 1) - as);
node.right = this.preInOrder(a, b, i + 1, ae, (bs + 1) + (i - 1) - as + 1, be);
return node;
}
}
/**
* 初始化一个tree
* 类广度遍历
* @param a
* @return
*/
public TreeNode initTree(Integer[] a) {
if(a == null || a.length == 0) {
return null;
}
int t = 0;
TreeNode p = new TreeNode(a[t]); //至少有一个元素
Queue<TreeNode> q = new LinkedList<>();
q.offer(p);
while(!q.isEmpty()) {
TreeNode node = q.poll();
if(t + 1 == a.length) { //先判断数组中是否还有下一个元素
return p;
}else {
t++;
if(a[t] == null) { //若下一个元素为null,则不需要创建新的节点
node.left = null;
}else {
node.left = new TreeNode(a[t]);
q.offer(node.left);
}
}
if(t + 1 == a.length) {
return p;
}else {
t++;
if(a[t] != null){ //上面的简写,a[t] == null,不需要再赋值
node.right = new TreeNode(a[t]);
q.offer(node.right);
}
}
}
return p;
}
@Test
public void test() {
Integer[] arr = new Integer[] {1, 2, 3, 4, 5, 9, 10, null, 6, 7, 8, null, null, null, 11};
TreeNode head = this.initTree(arr);
List<Integer> lista = new ArrayList<>();
List<Integer> listb = new ArrayList<>();
System.out.println("\n输出前序遍历:");
this.preOrder(head, listb);
System.out.println("\n输出中序遍历:");
this.inOrder(head, lista);
Integer[] a = new Integer[lista.size()];
Integer[] b = new Integer[listb.size()];
lista.toArray(a);
listb.toArray(b);
System.out.println("\n输出中序遍历");
head = this.preInOrder(a, b, 0, a.length - 1, 0, b.length - 1);
this.inOrder(head, lista);
}
/**
* 中序遍历
* @param head
* @param list
*/
public void inOrder(TreeNode head, List<Integer> list) {
if(head == null) {
return ;
}else {
this.inOrder(head.left, list);
list.add(head.val);
System.out.print(head.val + " ");
this.inOrder(head.right, list);
}
}
/**
* 前序遍历
* @param head
* @param list
*/
public void preOrder(TreeNode head, List<Integer> list) {
if(head == null) {
return ;
}else {
list.add(head.val);
System.out.print(head.val + " ");
this.preOrder(head.left, list);
this.preOrder(head.right, list);
}
}
}