树的遍历

  • 前序遍历:中左右
  • 中序编列:左中右
  • 后续编列:左右中
//前序遍历
public static void preOrder(Node node) {
	if (node == null) {
		return;
	}
	System.out.print(node.value);
	preOrder(node.left);
	preOrder(node.right);
}

//中序遍历
public static void inOrder(Node node) {
	if (node == null) {
		return;
	}
	inOrder(node.left);
	System.out.print(node.value);
	inOrder(node.right);
}

//后序遍历
public static void postOrder(Node node) {
	if (node == null) {
		return;
	}
	postOrder(node.left);
	postOrder(node.right);
	System.out.print(node.value);

}

/**
 * 非递归实现
 */
//前序遍历
public static void preOrder02(Node node) {
	Stack<Node> stack = new Stack<>();
	while (node != null || !stack.isEmpty()) {
		while (node != null) {
			System.out.print(node.value);
			stack.push(node);
			node = node.left;
		}
		node = stack.pop().right;

	}
}

//中序遍历
public static void inOrder02(Node node) {
	Stack<Node> stack = new Stack<>();
	while (node != null || !stack.isEmpty()) {
		while (node != null) {
			stack.push(node);
			node = node.left;
		}
		node = stack.pop();
		System.out.print(node.value);
		node = node.right;
	}
}

//后序遍历
public static void postOrder2(Node node) {
	Stack<Node> stack = new Stack<Node>();
	Stack<Integer> tag = new Stack<Integer>();
	while (node != null || !stack.isEmpty()) {
		if (node != null) {
			stack.push(node);
			tag.push(1);  //第一次访问
			node = node.left;
		} else {
			if (tag.peek() == 2) {
				System.out.print(stack.pop().value);
				tag.pop();
			} else {
				tag.pop();
				tag.push(2); //第二次访问
				node = stack.peek().right;
			}
		}

	}
//层序遍历
public static void levelOrder(Node node) {
	LinkedList<Node> list = new LinkedList<>();
	list.add(node);
	while (!list.isEmpty()) {
		node = list.poll();
		System.out.print(node.value);
		if (node.left != null) {
			list.offer(node.left);
		}
		if (node.right != null) {
			list.offer(node.right);
		}
	}
}

测试用例

//测试用例
public static void test(Node node) {
	System.out.print("递归_前序排序:");
	preOrder(node);
	System.out.println();
	System.out.print("前序排序:");
	preOrder02(node);
	System.out.println();
	System.out.print("递归_中序遍历:");
	inOrder(node);
	System.out.println();
	System.out.print("中序遍历:");
	inOrder02(node);
	System.out.println();
	System.out.print("递归_后序排序:");
	postOrder(node);
	System.out.println();
	System.out.print("后序排序:");
	postOrder2(node);
	System.out.println();
	System.out.print("层序遍历:");
	levelOrder(node);
	System.out.println();
}
public static void main(String[] args) {
	BST<Integer, Integer> bst = new BST<>();
	bst.put(3, 3);
	bst.put(2, 2);
	bst.put(4, 4);
	TreeOrder.test(bst.root);
}

输出

递归_前序排序:324
前序排序:324
递归_中序遍历:234
中序遍历:234
递归_后序排序:243
后序排序:243
层序遍历:324
posted @ 2019-08-31 19:52  tangmeng  阅读(185)  评论(0编辑  收藏  举报