力扣——二叉树的锯齿形层次遍历思路分析

题目描述

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

3

/
9 20
/
15 7
返回锯齿形层次遍历如下:

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

思路分析:

这个题目首先,就是做到如何去遍历,我用到的是dfs去遍历这棵树,然后巧妙地运用id这个标记序号,它代表了这个结点应该属于那一层,然后用它每次去和list.size去比较,小于它时就证明他以及存在兄弟结点了,只用在那一层将它的值加入即可,反之,如果id大于等于list.size,说明它是第一个到达该层的结点,我们给list添加新列表,然后保存node的值,显然,这样做完之后,得到的结果全部都是先遍历左再遍历右的结果,题目要求的是我们要每一层的遍历顺序不一样,左右轮换着来,那我们完全可以在拿到结果之后,对列表的所有偶数层进行反转保存,就能得到题目要求的结果,最终得出的代码执行效率还要略高于官方所提供的。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    
    
		List<List<Integer>> list = new LinkedList<List<Integer>>();
		List<Integer> temp = new LinkedList<Integer>();
		list.add(temp);
		list = work(root,list,0);
		int k = 0;
		for(List<Integer> res:list) {
    
    
			k++;
			if(k % 2 == 0) 
				Collections.reverse(res);
		}
		return list;
    }
	public List<List<Integer>> work(TreeNode node,List<List<Integer>> list,int id) {
    
    
		if(id >= list.size()) {
    
    
			List<Integer> temp = new LinkedList<Integer>();
			temp.add(node.val);
			list.add(temp);
		}else {
    
    
			list.get(id).add(node.val);
		}
		if(node.left != null) {
    
    
			work(node.left,list,id+1);
		}
		if(node.right != null) {
    
    
			work(node.right,list,id+1);
		}
		return list;
    }
}/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    
    
		List<List<Integer>> list = new LinkedList<List<Integer>>();
		if(root == null)
			return list;
		List<Integer> temp = new LinkedList<Integer>();
		list.add(temp);
		list = work(root,list,0);
		int k = 0;
		for(List<Integer> res:list) {
    
    
			k++;
			if(k % 2 == 0) 
				Collections.reverse(res);
		}
		return list;
    }
	public List<List<Integer>> work(TreeNode node,List<List<Integer>> list,int id) {
    
    
		if(id >= list.size()) {
    
    
			List<Integer> temp = new LinkedList<Integer>();
			temp.add(node.val);
			list.add(temp);
		}else {
    
    
			list.get(id).add(node.val);
		}
		if(node.left != null) {
    
    
			work(node.left,list,id+1);
		}
		if(node.right != null) {
    
    
			work(node.right,list,id+1);
		}
		return list;
    }
}

猜你喜欢

转载自blog.csdn.net/baldicoot_/article/details/109595344
今日推荐