【复习笔记】二叉树的前中后非递归遍历算法

12 篇文章 0 订阅
9 篇文章 0 订阅

前序遍历

思路:全局指针,指向根节点,所到节点立即访问,然后把节点入栈,往左走。

当左子树为空时,pop栈顶节点,如果栈顶右子树不空,把全局指针往右走,继续循环。

循环结束条件:栈为空并且全局指针为null时。

public static void preIte(TreeNode root){
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode temp = root;
		while(!stack.isEmpty() || temp != null){
			
			if(temp != null){
				System.out.println(temp.val);
				stack.add(temp);
				temp = temp.left;
			}else{
				temp = stack.pop();
				temp = temp.right;
			}
		}
	}

中序遍历

思路:全局指针,初始指向根节点,循环入栈,直到全局指针的左子树为空。

pop栈顶节点并访问,如果栈顶节点的右子树不为空,则全局指针往右走,继续循环。

循环结束条件:栈空或者全局指针为null时。

public static void midIte(TreeNode root){
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode temp = root;
		while(temp != null || !stack.isEmpty()){
			
			while(temp != null){
				stack.add(temp);
				temp = temp.left;
			}
			
			if(!stack.isEmpty()){
				temp = stack.pop();
				System.out.println(temp.val);
				temp = temp.right;
			}
		}
	}

后序遍历

思路:全局指针+上一次遍历节点的指针,首先根节点入栈。

如果全局指针现在指向的节点没有左右孩子 或者 全局指针指向的节点的左孩子或者右孩子是上一次遍历的节点,则

遍历当前节点,并出栈,同时上一次遍历的节点指向此节点。否则,当前节点的右孩子若不为空,右孩子入栈,当前节点的左孩子不为空,左孩子入栈。

循环结束条件:栈空。

public static void postIte(TreeNode root){
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode temp = root;
		TreeNode preNode = null;
		if(temp != null) stack.add(temp);
		while(!stack.isEmpty()){
			temp = stack.peek();
			if((temp.right == null && temp.left == null) ||
					(preNode != null && (temp.left == preNode || temp.right == preNode))){
				System.out.println(temp.val);
				stack.pop();
				preNode = temp;
			}else{
				if(temp.right != null)
					stack.add(temp.right);
				if(temp.left != null)
					stack.add(temp.left);
			}
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值