二叉树的遍历(Java)

4 篇文章 0 订阅
二叉树的遍历分为:前序遍历,中序遍历,后序遍历,层次遍历。本文主要讲述二叉树的前中后序遍历的递归实现和非递归实现(Java代码实现)。

先上一个二叉树,我们来看看它的前中后序输出分别是什么:

接下来我们用代码实现:

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) {
		val = x;
	}
}

public class Tree {
	//前序递归使用
	List<Integer> bforder=new ArrayList<>();
	//中序递归使用
	List<Integer> inorder=new ArrayList<>();
	//后序递归使用
	List<Integer> aforder=new ArrayList<>();
	
	//递归前序遍历二叉树
	public List<Integer> bforderTraversal(TreeNode root) {
		bforder(root);
		return bforder;
	}
	void bforder(TreeNode root){
		if(root==null){
			return;
		}
		bforder.add(root.val);
		bforder(root.left);
		bforder(root.right);
	}
	
	//不递归前序遍历二叉树
	public List<Integer> bforderTraversal1(TreeNode root) {
		List<Integer> res= new ArrayList<>();
		Stack<TreeNode> s=new Stack<>();
		if(root==null){
			return res;
		}
		s.push(root);
		while(!s.isEmpty()){
			TreeNode p=s.pop();
			res.add(p.val);
			if(p.right!=null){
				s.push(p.right);
			}
			if(p.left!=null){
				s.push(p.left);
			}
		}
		return res;
	}
	
	//递归中序遍历二叉树
	public List<Integer> inorderTraversal(TreeNode root) {
		inorder(root);
		return inorder;
	}
	void inorder(TreeNode root){
		if(root==null){
			return;
		}
		inorder(root.left);
		inorder.add(root.val);
		inorder(root.right);
	}
	//非递归中序遍历二叉树
	public List<Integer> inorderTraversal1(TreeNode root) {
		List<Integer> res= new ArrayList<>();
		if(root==null){
			return res;
		}
		Stack<TreeNode> s=new Stack<>();
		TreeNode p=root;
		while(p!=null || !s.isEmpty()){
			while(p!=null){
				s.push(p);
				p=p.left;
			}
			if(!s.empty()){
				p=s.pop();
				res.add(p.val);
				p=p.right;
			}
		}
		return res;
	}
	
	//递归后序遍历二叉树
	public List<Integer> aforderTraversal(TreeNode root) {
		aforder(root);
		return aforder;
	}
	void aforder(TreeNode root){
		if(root==null){
			return;
		}
		aforder(root.left);
		aforder(root.right);
		aforder.add(root.val);
	}
	//非递归后序遍历二叉树
	public List<Integer> aforderTraversal1(TreeNode root) {
		List<Integer> res= new ArrayList<>();
		Stack<TreeNode> s=new Stack<>();
		if(root==null){
			return res;
		}
		s.push(root);
		TreeNode cur=root;
		TreeNode pre=null;
		while(!s.isEmpty()){
			cur=s.peek();
            if((cur.left==null&&cur.right==null)||((pre!=null)&&(pre==cur.left||pre==cur.right))) {
                res.add(cur.val);
                s.pop();
                pre=cur; //注意这里,pre仅仅在输出了cur的时候下才更新。
            }else{
                if(cur.right!=null)
                    s.push(cur.right);
                if(cur.left!=null)
                    s.push(cur.left);
            }
		}
		return res;
	}
	//非递归后序遍历二叉树
	public List<Integer> aforderTraversal2(TreeNode root) {
		List<Integer> res= new ArrayList<>();
		Stack<TreeNode> s=new Stack<>();
		if(root==null){
			return res;
		}
		s.push(root);
		while(!s.isEmpty()){
			TreeNode p=s.pop();
			res.add(p.val);
			if(p.left!=null){
				s.push(p.left);
			}
			if(p.right!=null){
				s.push(p.right);
			}
		}
		Collections.reverse(res);
		return res;
	}
	
	
	@Test
	public void test(){
		TreeNode root =new TreeNode(10);
		TreeNode node1=new TreeNode(2);
		TreeNode node2=new TreeNode(5);
		TreeNode node3=new TreeNode(8);
		TreeNode node4=new TreeNode(7);
		TreeNode node5=new TreeNode(6);
		root.left=node1;
		root.right=node2;
		node1.left=node3;
		node2.left=node4;
		node2.right=node5;
		
		//测试前序遍历(非递归)
		System.out.println("前序遍历(非递归):");
		System.out.println(bforderTraversal1(root));
		//测试前序遍历(递归)
		System.out.println("前序遍历(递归):");
		System.out.println(bforderTraversal(root));
		
		
		//测试中序遍历(非递归)
		System.out.println("中序遍历(非递归):");
		System.out.println(inorderTraversal1(root));
		//测试中序遍历(递归)
		System.out.println("中序遍历(递归):");
		System.out.println(inorderTraversal(root));
		
		
		//测试后序遍历(非递归)
		System.out.println("后序遍历(非递归):");
		System.out.println(aforderTraversal2(root));
		//测试后序遍历(递归)
		System.out.println("后序遍历(递归):");
		System.out.println(aforderTraversal(root));
	}
}

运行结果:

前序遍历(非递归):
[10, 2, 8, 5, 7, 6]
前序遍历(递归):
[10, 2, 8, 5, 7, 6]
中序遍历(非递归):
[8, 2, 10, 7, 5, 6]
中序遍历(递归):
[8, 2, 10, 7, 5, 6]
后序遍历(非递归):
[8, 2, 7, 6, 5, 10]
后序遍历(递归):
[8, 2, 7, 6, 5, 10]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值