我是靠谱客的博主 能干鞋垫,最近开发中收集的这篇文章主要介绍二叉树非递归遍历,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

二叉树节点:

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;
				}
			}
		}
		
	}




最后

以上就是能干鞋垫为你收集整理的二叉树非递归遍历的全部内容,希望文章能够帮你解决二叉树非递归遍历所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部