1.遞歸遍歷
- 在使用遞歸遍歷的時候,每個節點會經過三次.
public class PreInPosTraversal {
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 + " ");
}
}
2.非遞歸遍歷
- 非遞歸一般只會經過每個節點兩次
// 前序非遞歸(中左右),使用一個棧。先壓右節點,再壓左節點。
public static void preOrderUnRecur(Node head) {
System.out.print("pre-order: ");
if(root==null) return;
Stack<TreeNode> s=new Stack<>();
while (!s.isEmpty()||root!=null){
while(root!=null){
System.out.print(root.val+" ");
s.push(root);
root=root.left;
}
if(!s.isEmpty()){
TreeNode t=s.pop();
root=t.right;
}
}
}
// 中序非遞歸(左中右),使用一個棧。
// 若節點非空,一路向左下壓棧,若節點空,則彈出打印並將右節點壓棧繼續循環。
public static void inOrderUnRecur(Node head) {
System.out.print("in-order: ");
if(root==null) return;
Stack<TreeNode> s=new Stack<>();
while (!s.isEmpty()||root!=null){
while(root!=null){
s.push(root);
root=root.left;
}
if(!s.isEmpty()){
TreeNode t = s.pop();
System.out.print(t.val+" ");
root=t.right;
}
}
}
// 後續非遞歸(左右中)。可以使用微調後的前序遍歷作爲輔助,得到(中右左),循環過程中壓棧最後彈出就可以得到(左右中)。
public static void posOrderUnRecur1(Node head) {
System.out.print("pos-order: ");
if (head != null) {
Stack<Node> s1 = new Stack<Node>();
Stack<Node> s2 = new Stack<Node>();
s1.push(head);
while (!s1.isEmpty()) {
head = s1.pop();
s2.push(head);
if (head.left != null) {
s1.push(head.left);
}
if (head.right != null) {
s1.push(head.right);
}
}
while (!s2.isEmpty()) {
System.out.print(s2.pop().value + " ");
}
}
}
3.層次遍歷
// 層次遍歷,用隊列保存每個節點的左右子節點。
public static void level (Node node) {
if (node == null) {
return;
}
List<Node> list = new ArrayList<Node>();
list.add(node);
while (!list.isEmpty()) {
Node temp = list.remove(0);
System.out.println(temp.value);
if (temp.left != null) {
list.add(temp.left);
}
if (temp.right != null) {
list.add(temp.right);
}
}
}