java数据结构之二叉树的遍历

二叉树的遍历:

先序遍历二叉树的操作是:

若二叉树为空,则空操作;否则

1.访问根结点

2.先序遍历左子树

3先序遍历右子树

中序遍历二叉树的操作是:

若二叉树为空,则空操作;否则

1.中序遍历左子树

2.访问根结点

3.中序遍历右子树

后序遍历二叉树的操作是:

若二叉树为空,则空操作;否则

1.后序遍历左子树

2.后序遍历右子树

3.访问根结点

基本代码:

package Tree;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

class BTree {
	String value;
	BTree lchild, rchild;

	public BTree() {
	}

	public BTree(String value) {
		this.value = value;
		lchild = null;
		rchild = null;
	}

	public BTree getLchild() {
		return lchild;
	}

	public void setLchild(BTree lchild) {
		this.lchild = lchild;
	}

	public BTree getRchild() {
		return rchild;
	}

	public void setRchild(BTree rchild) {
		this.rchild = rchild;
	}

}

public class BineryTree1 {
	private BTree root;

	public BineryTree1() {
	}

	public BineryTree1(BTree root) { // 构造函数
		this.root = root;
	}

	// 创建二叉树
	public void createBiTree() {
		Scanner scn = null;
		try {
			scn = new Scanner(new File("F:\\input.txt"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		this.root = createBiTree(root, scn);
	}

	private BTree createBiTree(BTree node, Scanner scn) {

		String temp = scn.next();
		if (temp.trim().equals("#")) {
			return null;
		} else {
			node = new BTree(temp);
			node.setLchild(createBiTree(node.getLchild(), scn));
			node.setRchild(createBiTree(node.getRchild(), scn));
			return node;
		}
	}

	// 遍历二叉树
	// 前序递归遍历二叉树
	public void preOrderTree(BTree node) {
		if (node == null)
			return;
		System.out.print(node.value + " ");
		preOrderTree(node.lchild);
		preOrderTree(node.rchild);
	}

	// 用栈非递归先序遍历
	private void preOderTraverse() {
		Stack<BTree> stack = new Stack<BTree>();
		BTree node = root;

		while (node != null | !stack.isEmpty()) {
			while (node != null) {
				System.out.print(node.value + " ");
				stack.push(node);
				node = node.getLchild();
			}
			node = stack.pop();
			node = node.getRchild();
		}
	}

	// 中序递归遍历二叉树
	public void inOrderTree(BTree node) {
		if (node == null)
			return;
		inOrderTree(node.lchild);
		System.out.print(node.value + " ");
		inOrderTree(node.rchild);

	}

	// 用栈来非递归中序遍历二叉树
	public void inOrderTraverse() {
		Stack<BTree> stack = new Stack<BTree>();
		BTree node = root;
		while (node != null || !stack.isEmpty()) {
			while (node != null) {
				stack.push(node);
				node = node.getLchild();
			}
			node = stack.pop();
			System.out.print(node.value + " ");
			node = node.getRchild();
		}
	}

	// 后序递归遍历二叉树

	public void postOrderTree(BTree node) {
		if (node == null)
			return;
		postOrderTree(node.lchild);
		postOrderTree(node.rchild);
		System.out.print(node.value + " ");

	}

	// 非递归后序遍历二叉树
	public void postOderTraverse() {
		Stack<BTree> stack = new Stack<BTree>();
		BTree node = root;
		BTree n = root;
		while (node != null) {
			// 左子树入栈
			for (; node.getLchild() != null; node = node.getLchild()) {

				stack.push(node);
			}
			// 当节点无右子树或者右子树已经输出
			while (node != null && (node.getRchild() == null)
					|| (node.getRchild() == n)) {
				System.out.print(node.value + " ");
				n = node;// 记录已经输出的节点
				if (stack.isEmpty())
					return;
				node = stack.pop();

			}// 处理右子树
			stack.push(node);
			node = node.getRchild();
		}
	}

	// 层次遍历二叉树,用队列

	public void levelTreverse() {

		Queue<BTree> queue = new LinkedList<BTree>();
		BTree node = root;
		queue.add(node);
		while (!queue.isEmpty()) {
			node = queue.remove();
			if (node != null) {
				System.out.print(node.value + " ");
				queue.add(node.getLchild());
				queue.add(node.getRchild());
			}

		}

	}

	public static void main(String[] args) {
		BineryTree1 tree = new BineryTree1();
		tree.createBiTree();
		tree.preOrderTree(tree.root);
		System.out.println();
		tree.inOrderTree(tree.root);
		System.out.println();
		tree.postOrderTree(tree.root);
		System.out.println();
		tree.inOrderTraverse();
		System.out.println();
		tree.preOderTraverse();
		System.out.println();
		tree.postOderTraverse();
		System.out.println();
		tree.levelTreverse();

	}

}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值