【LeetCode】二叉树(进阶题1)

使用非递归方式,对二叉树进行,前序、中序、后序遍历。

import java.util.Stack;

public class BinaryTree {
	class TreeNode{
		public int val;
		public TreeNode left;
		public TreeNode right;
		
		public TreeNode(int val) {this.val = val;}

		@Override
		public String toString() {
			return "TreeNode [val=" + val + "]";
		}
		
	}
	
	//利用栈实现非递归版本的前序遍历
	public void preOrder(TreeNode root) {
		if(root == null) {
			return;
		}
		//1、创建一个栈
		Stack<TreeNode>stack = new Stack<>();
		//2、先把根节点入栈
		stack.push(root);
		//3、循环取栈顶元素并访问
		while(!stack.isEmpty()) {
			TreeNode cur = stack.pop();
			System.out.println(cur.val);
			//4、把当前元素的按右子树然后左子树的顺序入栈
			if(cur.right!=null) {
				stack.push(cur.right);
			}
			if(cur.left!=null) {
				stack.push(cur.left);
			}
		}
	}
	
	//利用栈实现非递归版本的中序遍历
	public void inOrder(TreeNode root) {
		if(root == null) {
			return;
		}
		//1、创建啊一个栈
		Stack<TreeNode>stack = new Stack<>();
		//2、创建一个cur变量从root开始
		TreeNode cur = root;
		//3、只要cur结点非空就入栈,且cur=cur.left
		while(true) {
			while(cur!=null) {
				stack.push(cur);
				cur = cur.left;
			}
			//4、当cur=null,就出栈一个元素,且访问该元素
			if(stack.isEmpty()) {
				break;
			}
			TreeNode top = stack.pop();
			System.out.println(top.val);
			//5、cur指向当前元素的右子树
			cur = top.right;
		}
	}
	
	//利用栈实现非递归版本的后序遍历
	public void postOrder(TreeNode root) {
		if(root == null) {
			return;
		}
		//1、创建一个栈
		Stack<TreeNode> stack = new Stack<>();
		//2、创建cur从root出发
		TreeNode cur = root;
		//prev永远指向上次访问的结点
		TreeNode prev = null;
		while(true) {
			//3、借助cur循环往左走,如果不为空就 入栈
			while(cur != null) {
				stack.push(cur);
				cur = cur.left;
			}
			//4、如果为null,取栈顶元素,若top能访问再pop,否则不能出栈
			TreeNode top = stack.peek();
			//5、是否访问栈顶元素,两种情况:
			//  a)栈顶元素没有右子树,可以访问
			//  b)栈顶元素的右子树刚刚访问过,也可以访问
			if(top.right == null || prev == top.right) {
				//可以访问top结点
				System.out.println(top.val);
				stack.pop();
				//更新prev
				prev = top;
			} else {
				//此时不能访问top结点
				//6、cur指向栈顶元素右子树
				cur = top.right;
			}
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值