二叉树的递归遍历、非递归遍历、层次遍历

1.递归遍历

2.非递归遍历

3.层次遍历


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 (head != null) {
			Stack stack = new Stack();
			stack.add(head);
			while (!stack.isEmpty()) {
				head = stack.pop();
				System.out.print(head.value + " ");
				if (head.right != null) {
					stack.push(head.right);
				}
				if (head.left != null) {
					stack.push(head.left);
				}
			}
		}
	}

// 中序非递归(左中右),使用一个栈。
// 若节点非空,一路向左下压栈,若节点空,则弹出打印并将右节点压栈继续循环。
public static void inOrderUnRecur(Node head) {
		System.out.print("in-order: ");
		if (head != null) {
			Stack stack = new Stack();
			while (!stack.isEmpty() || head != null) {
				if (head != null) {
					stack.push(head);
					head = head.left;
				} else {
					head = stack.pop();
					System.out.print(head.value + " ");
					head = head.right;
				}
			}
		}
	}

// 后续非递归(左右中)。可以使用微调后的前序遍历作为辅助,得到(中右左),循环过程中压栈最后弹出就可以得到(左右中)。
public static void posOrderUnRecur1(Node head) {
		System.out.print("pos-order: ");
		if (head != null) {
			Stack s1 = new Stack();
			Stack s2 = new Stack();
			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 list = new ArrayList();
        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);
            }
        }
    }

 

你可能感兴趣的:(Algorithms)