二叉树的层序遍历---java实现

1、二叉树的层序遍历

           即按照层输出节点

1.2  按照之字型打印

          即奇数行从左往右打印,偶数行从右往左打印。

          那么可以借助栈先进后出的特点实现之字形打印二叉树,设两个栈 stack1,stack2,stack2为辅助栈

                奇数行,从左往右打印:当前出栈节点的左节点先入栈 右节点 再入栈(从stack1出,入stack2)

                偶数行,从右往左打印:当前出栈节点的右节点先入栈 左节点再入栈 (从stack1出,入stack2)

                辅助栈stack2中节点出栈的顺序为下一行打印的顺序

一个简单的例子:

之字形打印二叉树

java实现的代码如下:

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
	Stack<TreeNode> stack1 = new Stack<TreeNode>();
	if(pRoot != null) {
		stack1.push(pRoot);
		boolean b = true;//b=true时候从左到右    b = false时候从右到左
		while(!stack1.isEmpty()) {
			ArrayList<Integer> array = new ArrayList<Integer>();
			Stack<TreeNode> stack2 = new Stack<TreeNode>();//辅助栈 初始化
			if(b) {//从左到右
				while(!stack1.isEmpty()) {
					TreeNode node = stack1.pop();
					if(node.left != null) 
						stack2.push(node.left);
					if(node.right != null) 
						stack2.push(node.right);
					array.add(node.val);	
				}
			}else {//从右到左
				while(!stack1.isEmpty()) {
					TreeNode node = stack1.pop();
					if(node.right != null)
						stack2.push(node.right);
					if(node.left != null)
					    stack2.push(node.left);
					array.add(node.val);	
				}
			}
			b = !b;
			arrays.add(array);
			stack1 = stack2;
		}
	}
	return arrays;
}

  1.3 层序遍历2

           从上到下按层打印二叉树,每一层节点从左至右输出。

          借助队列先进先出原则就可实现。(可以通过两个队列,其中一个作为辅助队列;也可以通过一个队列,同时以一个int型变量记录每一层节点数即可)

java实现的代码如下:(两个队列)

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
	LinkedList<TreeNode> queue1 = new LinkedList<TreeNode>();
	ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
	if(pRoot != null) {
		queue1.add(pRoot);
		while(!queue1.isEmpty()) {
			LinkedList<TreeNode> queue2 = new LinkedList<TreeNode>();
			ArrayList<Integer> array = new ArrayList<Integer>();
			while(!queue1.isEmpty()) {
				TreeNode node = queue1.poll();
				if(node.left != null)
					queue2.add(node.left);
				if(node.right != null)
					queue2.add(node.right);
				array.add(node.val);
			}
			arrays.add(array);
			queue1 = queue2;
		}
	}
	return arrays;
}

java代码实现(一个队列)

public ArrayList<ArrayList<Integer> > Print1(TreeNode pRoot) {
	LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
	ArrayList<ArrayList<Integer>> arrays = new ArrayList<ArrayList<Integer>>();
	if(pRoot != null) {
		queue.add(pRoot);
		int len  = 1;
		while(!queue.isEmpty()) {
			int val = 0;
			ArrayList<Integer> array = new ArrayList<Integer>();
			for(int i = 0; i < len; i++) {
				TreeNode node = queue.poll();
				if(node.left != null) {
					queue.add(node.left);
					val++;
				}	
				if(node.right != null) {
					queue.add(node.right);
		 		     val++;
				}
				array.add(node.val);
			}
			arrays.add(array);
			len = val;
		}
	}
	return arrays; 
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值