2021-1-30-一个模板解决二叉树非递归遍历(前中后)

思想:

非递归遍历需要使用来作为存储树节点的容器,使用一个指针来作为判断,决定入栈还是出栈。

非递归遍历模板:

  • 先序和中序
 public List<Integer> preAndInOrderTraversal(TreeNode root) {
		List<Integer> ret = new ArrayList<>();
		Stack<TreeNode> stack=new Stack<TreeNode>();
		TreeNode node;
		while (root!=null||!stack.isEmpty()){
			if (root!=null){
				stack.push(root);
//				ret.add(root.val); 先序
				root=root.left;
			}else {
				node=stack.pop();
//				ret.add(node.val);中序
				root=node.right;
			}
		}
		return  ret;
    }
  • 后序遍历
public List<Integer> postorderTraversal(TreeNode root) {
		List<Integer> ret = new ArrayList<>();
		Stack<TreeNode> stack=new Stack<TreeNode>();
		TreeNode node;
		while (root!=null||!stack.isEmpty()){
			if (root!=null){
				stack.push(root);
				ret.add(root.val);
				root=root.right;
			}else {
				node=stack.pop();
				root=node.left;
			}
		}
		Collections.reverse(ret);
		return  ret;
    }
  • 灵感

灵感来源于使用栈的时候,无法保证出栈和入栈的时机。所以使用一个指针来配合使用。上述模板的意义在于根据指针是否为空,来决定入栈还是出栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值