LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解

题目:

Given a binary tree, return the zigzag level order traversal of its nodes‘ values. (ie, from left to right, then right to left for the next level and alternate between).

For example:

Given binary tree {3,9,20,#,#,15,7},

    3
   /   9  20
    /     15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]

解题:

这题其实和二叉树的层序遍历很类似  仅仅是在这个基础上加上一个左右方向  一开始我的思维被局限住了  写了一个很冗余的代码版本  实现思路是这样的 当需要从右到左输出的时候  我把队列里面的节点输出然后 反序存回队列

代码:

public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {

		List<List<Integer>> result=new ArrayList<List<Integer>>();//存放最终结果
		boolean isLeftToRight=false;//从左到右的方向
		Queue<TreeNode> nodeQueue=new LinkedList<>();//存放节点 便于每一层遍历

		//处理根节点
		if(root==null)
			return result;
		else {
			List<Integer> list=new ArrayList<>();
			list.add(root.val);
			result.add(list);
			nodeQueue.offer(root);
		}

		while(!nodeQueue.isEmpty())
		{
			int size=nodeQueue.size();
			List<Integer> tempResult=new ArrayList<>();//用来暂时存放每一层节点的遍历结果

			Stack<TreeNode> stack=new Stack<>();//用来辅助将队列倒序

			if(isLeftToRight)
			{
				//将队列里面的节点都先出队列进栈再出栈进队列  使得和原来的顺序刚好相反
				for(int i=0;i<size;i++)
				{
					stack.push(nodeQueue.poll());
				}
				while(!stack.isEmpty())
					nodeQueue.offer(stack.pop());

				while(size>0)//从左到右
				{
					size--;
					TreeNode tempNode=nodeQueue.poll();
					if(tempNode.left!=null)
					{
						nodeQueue.offer(tempNode.left);
						tempResult.add(tempNode.left.val);
					}
					if(tempNode.right!=null)
					{
						nodeQueue.offer(tempNode.right);
						tempResult.add(tempNode.right.val);
					}
				}

				if(!tempResult.isEmpty())  result.add(tempResult);
				//循环退出 表示一层已经遍历完了  这时候重置方向标志位
				isLeftToRight=false;

			}
			else {
				//将队列里面的节点都先出队列进栈再出栈进队列  使得和原来的顺序刚好相反
				for(int i=0;i<size;i++)
				{
					stack.push(nodeQueue.poll());
				}
				while(!stack.isEmpty())
					nodeQueue.offer(stack.pop());

				while(size>0)//从右到左
				{
					size--;
					TreeNode tempNode=nodeQueue.poll();
					if(tempNode.right!=null)
					{
						nodeQueue.offer(tempNode.right);
						tempResult.add(tempNode.right.val);
					}
					if(tempNode.left!=null)
					{
						nodeQueue.offer(tempNode.left);
						tempResult.add(tempNode.left.val);
					}
				}
				if(!tempResult.isEmpty())  result.add(tempResult);
				//循环退出 表示一层已经遍历完了  这时候重置方向标志位
				isLeftToRight=true;
			}
		}

		return result;

    }

后面看别人的解答,其实完全没有必要在队列中反序  只要在存每一层输出结果的ArrayList中反序存入就可以了  下面是这种思路的代码:

public static List<List<Integer>> zigzagLevelOrder2(TreeNode root) {

		List<List<Integer>>  result=new ArrayList<List<Integer>>();//存放最终结果
 		Queue<TreeNode> nodeQueue=new LinkedList<>();//存放节点
		int flag=1;//flag为奇数的时候 从左到右  为偶数的时候从右到左;

		if(root==null)
			return result;
		else {
			nodeQueue.add(root);
		}

		while(!nodeQueue.isEmpty())
		{
			int count=nodeQueue.size();
			List<Integer> tempResult=new ArrayList<>();
			while(count>0)
			{
				TreeNode tempNode=nodeQueue.poll();
				count--;
				if(flag%2!=0)//从左到右
				{
					tempResult.add(tempNode.val);
				}
				else {//
					tempResult.add(0,tempNode.val);
				}

				if(tempNode.left!=null)
					nodeQueue.add(tempNode.left);
				if(tempNode.right!=null)
					nodeQueue.add(tempNode.right);
			}
			if(!tempResult.isEmpty()) result.add(tempResult);
			flag++;
		}

		return result;

	}

}

看代码的长度就知道我之前的有多复杂了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 21:43:47

LeetCode103 BinaryTreeZigzagLevelOrderTraversal(二叉树Z形层次遍历) Java题解的相关文章

LeetCode 103 二叉树的锯齿形层次遍历 以及 LinkedList

LeetCode103 二叉树的锯齿形层次遍历: 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:[[3],[20,9],[15,7]] import java.util.List; import java.util.ArrayList; import java.util.LinkedList;

LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). LeetCode103. Binary Tree Zigzag Level Order Traversal中等 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回锯齿形层次遍历如下: [

lintcode 二叉树的锯齿形层次遍历 (双端队列)

题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 返回其锯齿形的层次遍历为: [ [3], [20,9], [15,7] ] 思路: 我们用双端队列模拟一下这个过程

leetcode 103. 二叉树的锯齿形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回锯齿形层次遍历如下: [ [3], [20,9], [15,7] ] 1 class Solution { 2 public: 3 vector<vector<int>> zigzagLevelOrder(TreeNode* root) { 4 stack&l

LeetCode 第103题 二叉树的锯齿形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回锯齿形层次遍历如下: [ [3], [20,9], [15,7] ] 思路: 与层次遍历类似,可以直接将特定层次的结果倒置 1 class Solution103 { 2 3 public List<List<Integer>> zigzagLevelOrde

【python-leetcode103-树的宽度遍历】二叉树的锯齿形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20    / \  15 7返回锯齿形层次遍历如下: [ [3], [20,9], [15,7]] 代码: # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val =

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

领扣(LeetCode)二叉树的中序遍历 个人题解

给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归的思路很简单,不再累述,迭代的方法请参考百度. 对中序遍历的定义参考 https://baike.baidu.com/item/%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86/757281?fr=aladdin 代码如下: 1 class Solution { 2 List<Integer> a

二叉树之层次遍历

 下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里 任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右).在输入中,每个节点的左右括号之间没有空格,相邻节点之间用一个空格隔开.每棵数的输入用一队空括号 () 表示结束(这对括号本身并不代表一个节点),如图所示. (画的略丑) 注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出超出了一次应当输出 -1.节点数不超过 256. 样例输入: (11,LL) (7,LLL)