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

1、二叉树的层序遍历

           即按照层输出节点

1.2  按照之字型打印

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

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

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

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

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

一个简单的例子:

二叉树的层序遍历---java实现_第1张图片

java实现的代码如下:

public ArrayList > Print(TreeNode pRoot) {
	ArrayList> arrays = new ArrayList>();
	Stack stack1 = new Stack();
	if(pRoot != null) {
		stack1.push(pRoot);
		boolean b = true;//b=true时候从左到右    b = false时候从右到左
		while(!stack1.isEmpty()) {
			ArrayList array = new ArrayList();
			Stack stack2 = new Stack();//辅助栈 初始化
			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 > Print(TreeNode pRoot) {
	LinkedList queue1 = new LinkedList();
	ArrayList> arrays = new ArrayList>();
	if(pRoot != null) {
		queue1.add(pRoot);
		while(!queue1.isEmpty()) {
			LinkedList queue2 = new LinkedList();
			ArrayList array = new ArrayList();
			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 > Print1(TreeNode pRoot) {
	LinkedList queue = new LinkedList();
	ArrayList> arrays = new ArrayList>();
	if(pRoot != null) {
		queue.add(pRoot);
		int len  = 1;
		while(!queue.isEmpty()) {
			int val = 0;
			ArrayList array = new ArrayList();
			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; 
}

 

你可能感兴趣的:(二叉树的层序遍历,层序遍历,二叉树,数据结构,树)