二叉树的前序,中序,后序遍历(递归/非递归实现),层次遍历

算法必会基本内容

1,递归实现
感觉一句话可以概括了。。先看前序遍历:
public void bianli(TreeNode root){
	if(root==null)return;
	System.out.println(root.val); //牛客上要求是存在List中,这里就换成一个链表就好了
	bianli(root.left);
	bianli(root.right);
}
中序遍历和后序遍历就是依次改变System.out.println()那句话的位置,中序放中间,后序放后面。
2,非递归实现
主要使用栈或者队列实现,网上还有不用这两个辅助方式的Morris算法。。看到大神写过,有机会自己写一个试试,链接在这里Morris算法
1)前序遍历
public void preorder(TreeNode root){
		Stack<TreeNode> s=new Stack<>();
        TreeNode p=root;
        while(p!=null || !s.isEmpty()){
            if(p!=null){
                s.push(p);
                System.out.println(p.val);
                p=p.left;      

            }else{
                p=s.pop().right;
            }
        }
}
2)中序遍历
public void inorder(TreeNode root){
		Stack<TreeNode> s=new Stack<>();
        TreeNode p=root;
        while(p!=null || !s.isEmpty()){
            if(p!=null){
                s.push(p);
                p=p.left;      

            }else{
                p=s.pop();
                System.out.println(p.val);
                p=p.right;
            }
        }
}
3) 后序遍历有取巧的方式,可以用我这里是用了一个栈和双向链表实现,通过模拟一个中右左的前序遍历(倒序输出就是左右中),然后将遍历的节点反向存到双向链表中(每次存到0位置,正常的add操作是放到尾部):
public void postorder(TreeNode root){
		Stack<TreeNode> s=new Stack<>();   
        List<Integer> res=new LinkedList<>();
        TreeNode p=root;
        while(p!=null || !s.isEmpty()){
            if(p!=null){
                s.push(p);
                res.add(0,p.val);
                p=p.right;      
            }else{
                p=s.pop().left;
            }
        }   
        for(int i=0; i<res.size(); i++){
			System.out.println(res.get(i));
		}     
}
再依次打印这个双向链表即可
4) 层次遍历
这里同样是用一个双向链表即可实现,把它当成一个队列使用,具体步骤是每次先计算当前队列中的元素个数,即为这一层的个数,然后遍历一个节点输出,再将他的子节点添加到这个队列中,每次经过一个节点,就会把这一层元素的个数减一,减到0说明这一层结束。在leetcode第102这道题里面就是当每层结束的时候,把List<>添加到List<List<>>中。具体代码如下:
public void LevelOrder(TreeNode root){
		if(root==null) return null;
        LinkedList<TreeNode> queue = new LinkedList<>();
        TreeNode p = root;
        queue.offer(p);
        while(!queue.isEmpty()){
            int count = queue.size(); //获取当前这一层的个数
            while(count > 0){
                p = queue.poll();
                System.out.print(p.val);
                if(p.left != null){
                    queue.offer(p.left);
                }
                if(p.right != null){
                    queue.offer(p.right);
                }             
                count--;
            }
            	System.out.println();//换行
        }        

}
遍历属于比较基本的面试题目了,要达到可以非常熟练的手写出来并且知道每一步到底是在做什么这样的水平。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值