二叉树的先中后序,非递归实现

本文详细介绍了如何使用栈非递归地实现二叉树的先序、中序和后序遍历。先序遍历通过先将右节点加入栈中,再加入左节点;中序遍历采用迭代方式,一直遍历左子树并压栈,出栈后访问节点,遇到右孩子节点压栈;后序遍历则先将所有节点入栈,然后依次出栈并收集结果。
摘要由CSDN通过智能技术生成

先序遍历非递归实现

//先将树的右节点加入,再将树的左节点加入即可,因为出栈顺序是相反的
List<Integer> list = new ArrayList<>();
	Stack<TreeNode> s = new Stack<TreeNode>();

	public List<Integer> preorderTraversal(TreeNode root) {
		if (root == null) {
			return list;
		}
		s.add(root);
		while (!s.isEmpty()) {
			TreeNode top = s.pop();
			list.add(top.val);
			if (top.right != null) {
				s.push(top.right);
			}
			if (top.left != null) {
				s.push(top.left);
			}
		}
		return list;
	}

中序遍历

//一直遍历左节点到叶子节点,然后一直出栈,遇到有右孩子节点的节点,将它压入栈中,停止出栈,实际上,出栈就已经出了左孩子和根,再加入右孩子节点,把它当成一个树的根节点,继续相同的操作,最后就可以完成中序遍历
List<Integer> list = null;

	public List<Integer> inorderTraversal(TreeNode root) {
		list = new ArrayList<Integer>();
		Stack<TreeNode> sta = new Stack<TreeNode>();
		if (root == null) {
			return list;
		}
		sta.push(root);
		while (!sta.isEmpty()) {
			TreeNode top = sta.pop();
			sta.push(top);
			TreeNode left = top.left;
			while (left != null) {//一直遍历左孩子,压入栈中
				sta.push(left);
				left = left.left;
			}
			while (!sta.empty()) {//循环出栈
				top = sta.pop();
				list.add(top.val);
				if (top.right != null) {//如果栈顶的节点右孩子不为空,直接压入栈中,停止出栈
					sta.push(top.right);
					break;
				}
			}
		}
		return list;
	}

后序遍历

//使用一个栈保存结果就好
public List<Integer> postorderTraversal(TreeNode root) {
		list = new ArrayList<Integer>();
		Stack<TreeNode> sta = new Stack<TreeNode>();
		Stack<TreeNode> res = new Stack<>();
		if (root == null) {
			return list;
		}
		sta.push(root);
		while (!sta.isEmpty()) {
			TreeNode top = sta.pop();
			res.push(top);
			if (top.left != null) {
				sta.push(top.left);
			}
			if (top.right != null) {
				sta.push(top.right);
			}
		}
		while (!res.isEmpty()) {
			list.add(res.pop().val);
		}
		return list;
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值