二叉树非递归遍历

本文探讨了在面试中可能遇到的二叉树非递归遍历问题,重点介绍了二叉树前序遍历和后序遍历的非递归代码实现。后序遍历的难点在于正确处理节点的左右子树,通过栈来辅助操作,确保节点的左子树被完全处理后再处理右子树。
摘要由CSDN通过智能技术生成

面试的时候可能会问到二叉树的非递归遍历。

下面是自己写一些二叉树遍历的非递归的代码,仅供参考:

二叉树节点:

class TreeNode {   //二叉树节点
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}


二叉树前序遍历非递归

代码:

public void preorder(TreeNode root){
    	if(root==null)
    		return ;
    	
    	TreeNode p = root;
    	Stack<TreeNode> stack = new Stack<TreeNode>();
    	
    	while(p!=null || !stack.empty()){
    		while(p!=null){
    			System.out.println(p.val);
    			stack.push(p);
    			p=p.left;
    		}
    		while(p==null && !stack.empty()){
    			p=stack.pop();
    			p=p.right;
    		}
    	}
    }


二叉树中序遍历非递归

代码:

public void Midd(TreeNode root){ //实现二叉树中序遍历非递归
		if(root==null)
			return ;
		
		TreeNode p=root;
		Stack<TreeNode> stack =new Stack<TreeNode>();
		while(p!=null || !stack.empty()){
			while(p!=null){
				stack.push(p);
				p=p.left;
			}
			if(p==null && !stack.empty()){
				p=stack.pop();
				System.out.println(p.val);
				p=p.right;
			}
		}
	}


二叉树后序遍历非递归:

后序遍历应该是比较难写的一个,思路是拿到根节点,先将根节点的左子树全部压栈,当遇到左子树为空,则从栈中弹出(用peek,得到节点,但不从栈中删除)一个节点(注意栈中的节点的左子树都是处理过得,所以弹出来的节点不用考虑左子树),判断右子树是否为空,如果右子树为空,则将该节点的值输出,然后把该节点弹出(用pop()弹出节点,这个节点就处理完了),循环处理,直到某个节点的右子树不为空, 如果右子树不为空,则转向处理右子树,但这时要对栈顶节点进行处理,将右指针设为null(可以理解为右子树已经处理),处理右子树。

代码:

public static void postorder(TreeNode root){
		if(root==null)
			return ;
		
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode p = root;
		TreeNode temp;
		while(p!=null || !stack.empty()){
			while(p!=null){
				stack.push(p);
				p=p.left;
			}
			if(p==null && !stack.empty()){
				p=stack.peek();
				while(p.right==null){ //如果右指针为空,则左右都处理完了,需要处理本节点
					p=stack.pop();
					System.out.println(p.val);
					if(!stack.empty())
					   p=stack.peek();
					else
						return ;
				}
				if(p.right!=null){
					temp=p.right; //如果栈里弹出来的TreeNode右指针不为null,则处理右指针
					p.right=null;
					p=temp;
				}
			}
		}
		
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值