一、分別按照二叉樹先序,中序和後序打印所有的節點。
這道題就是書上的算法思想的實際使用,唯一需要特別注意到的是用遞歸的方式建樹,還是比較巧妙的,因爲一棵樹的建立過程字符流是重複使用的,用遞歸的方式對根進行循環賦值。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Tree1 {
//建立一棵樹
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
//前序遍歷
public static void preOrderRecur(Node head) {
if (head == null) {
return;
}
System.out.print(head.value + " ");
preOrderRecur(head.left);
preOrderRecur(head.right);
}
//中序遍歷
public static void inOrderRecur(Node head) {
if (head == null) {
return;
}
inOrderRecur(head.left);
System.out.print(head.value + " ");
inOrderRecur(head.right);
}
//後續遍歷
public static void posOrderRecur(Node head) {
if (head == null) {
return;
}
posOrderRecur(head.left);
posOrderRecur(head.right);
System.out.print(head.value + " ");
}
public static Node treeGenerate(BufferedReader in) throws IOException {
String[] str = in.readLine().split(" ");
Node root = new Node(Integer.parseInt(str[0]));
//遞歸進行賦值
if (Integer.parseInt(str[1]) != 0) {
//左孩子,遞歸調用再讀一行root即爲左孩子
root.left = treeGenerate(in);
}
if (Integer.parseInt(str[2]) != 0) {
//右孩子,遞歸調用再讀一行root即爲左孩子
root.right = treeGenerate(in);
}
return root;
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] str1 = bf.readLine().split(" ");
Node root = treeGenerate(bf);
preOrderRecur(root);
System.out.println();
inOrderRecur(root);
System.out.println();
posOrderRecur(root);
}
}
二、二叉樹的序列化
假設序列化的結果字符串爲 str,初始時 str = "",遍歷二叉樹時,遇到 null 節點,則在 str 的末尾加上 "#!",否則加上"當前的節點值!"。
輸出兩行分別表示該二叉樹的先序序列化和層序序列化
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
//建立一棵樹
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
//先序遍歷
public static StringBuilder preOrderRecur(Node head, StringBuilder sb) {
if (head == null) {
return sb.append("#!");
}
sb.append(head.value + "!");
preOrderRecur(head.left, sb);
preOrderRecur(head.right, sb);
return sb;
}
//層序遍歷
public static StringBuilder layerOrder(Node head, StringBuilder sb) {
if (head == null) {
sb.append("#!");
}
Queue<Node> queue = new LinkedList<>();
queue.add(head);
sb.append(head.value).append("!");
while (!queue.isEmpty()) {
head = queue.poll();
if (head.left != null) {
sb.append(head.left.value).append("!");
queue.add(head.left);
} else {
sb.append("#!");
}
if (head.right != null) {
sb.append(head.right.value).append("!");
queue.add(head.right);
} else {
sb.append("#!");
}
}
return sb;
}
public static Node treeGenerate(BufferedReader in) throws IOException {
String[] str = in.readLine().split(" ");
Node root = new Node(Integer.parseInt(str[0]));
//遞歸進行賦值
if (Integer.parseInt(str[1]) != 0) {
//左孩子,遞歸再調用
root.left = treeGenerate(in);
}
if (Integer.parseInt(str[2]) != 0) {
//右孩子,遞歸再調用
root.right = treeGenerate(in);
}
return root;
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String[] str1 = bf.readLine().split(" ");
Node root = treeGenerate(bf);
StringBuilder res1 = new StringBuilder();
res1=preOrderRecur(root,res1);
System.out.println(res1);
StringBuilder res2 = new StringBuilder();
res2 = layerOrder(root,res2);
System.out.println(res2);
}
}
這題目用String就是超時,必須要用StringBuilder。注意一下層序遍歷是通過一個queue來存儲的
感覺需要補充一下jvm的知識了。