二叉树3种遍历

import java.util.ArrayDeque;
import java.util.Deque;

//二叉树的遍历
public class TwotreeTraversal {
	public static void main(String[] args) {
		MyNode h = new MyNode("H", null, null);
		MyNode g = new MyNode("G", null, null);
		MyNode i = new MyNode("I", null, h);
		MyNode c = new MyNode("C", g, i);
		MyNode e = new MyNode("E", null, null);
		MyNode f = new MyNode("F", e, null);
		MyNode d = new MyNode("D", null, null);
		MyNode b = new MyNode("B", d, f);
		MyNode a = new MyNode("A", b, c);
		
		System.out.println("先序遍历如下:");
		xianxu(a);

		System.out.println("中序遍历如下:");
		zhongxu(a);

		System.out.println("后续遍历如下:");
		houxu(a);
	}

	// 先序遍历 根>左>右
	public static void xianxu(MyNode myNode) {
		// 递归退出条件
		if (myNode == null) {
			return;
		}
		// 访问本节点
		myNode.visit();
		// 访问左子节点
		xianxu(myNode.getLeft());
		// 访问右子节点
		xianxu(myNode.getRight());
	}

	// 中序遍历 左>根>右
	public static void zhongxu(MyNode myNode) {
		Deque<MyNode> deque = new ArrayDeque<MyNode>();
		// 如果当前节点不为空,或者deque.size>0循环一直继续
		while (myNode != null || deque.size() > 0) {
			while (myNode != null) {
				// 将一个节点压入deque
				deque.push(myNode);
				// 返回他的左节点
				myNode = myNode.getLeft();
			}
			// 此时中序遍历已经到达最左边节点
			if (deque.size() > 0) {
				// 将一个节点弹出deque
				myNode = deque.pop();
				myNode.visit();
				// 返回它的右节点
				myNode = myNode.getRight();
			}
		}
	}

	// 后序遍历 左>右>根
	// 采用双栈的思路,先遍历右子节点,再左节点,然后将其顺序存储在另一个栈中,该栈的弹栈顺序就是后序遍历顺序
	public static void houxu(MyNode myNode) {
		Deque<MyNode> deque = new ArrayDeque<>();
		Deque<MyNode> reverseDeque = new ArrayDeque<>();
		while (myNode != null || deque.size() > 0) {
			while (myNode != null) {
				//将该节点push进两个deque
				deque.push(myNode);
				reverseDeque.push(myNode);
				//返回右子节点
				myNode = myNode.getRight();
			}
			// 此时中序遍历已经到达最右边节点
			if (deque.size() > 0) {
				myNode = deque.pop();
				myNode = myNode.getLeft();
			}
		}

		while (reverseDeque.size() > 0) {
			myNode = reverseDeque.pop();
			myNode.visit();
		}
	}
}
public class MyNode {
	private String value;
	private MyNode left;
	private MyNode right;
	public MyNode(String value, MyNode left, MyNode right) {
		this.value = value;
		this.left = left;
		this.right = right;
	}
	//访问value值
	public void visit() {
		System.out.print(value+" ");
	}
	//获取左节点
	public MyNode getLeft() {
		return left;
	}
	//获取右节点
	public MyNode getRight() {
		return right;
	}
}

先序遍历

中序遍历

后序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值