题目描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例:
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
思路
1.思路与102.树的层次遍历相似,只不过需要隔层翻转。
2.可以设置一个翻转标识位flag,当falg == true时,进行头插法,这样便实现了翻转。
Java代码实现
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
LinkedList<TreeNode> nodes = new LinkedList<>();
List<Integer> curVals = new ArrayList<>();
int curMax = 1;
int count = 0;
if(root != null)
nodes.add(root);
//true : 反向压入值 false :正向压入值
boolean flag = false;
while(!nodes.isEmpty()){
TreeNode cur = nodes.pollFirst();
if(flag)
curVals.add(0,cur.val);
else
curVals.add(cur.val);
count++;
if(cur.left != null)
nodes.add(cur.left);
if(cur.right != null)
nodes.add(cur.right);
if(count == curMax){
curMax = nodes.size();
count = 0;
res.add(new ArrayList<>(curVals));
curVals = new ArrayList<>();
flag = !flag;
}
}
return res;
}
Golang代码实现
func levelOrder(root *TreeNode) [][]int {
res := make([][]int,0)
cur := make([]int,0)
nodeList := list.New()
if root != nil {
nodeList.PushBack(root)
}
count := 0
max := 1
flag := false
for nodeList.Len() > 0 {
curNode := nodeList.Front().Value.(*TreeNode)
nodeList.Remove(nodeList.Front())
cur = append(cur, curNode.Val)
count++
if curNode.Left != nil {
nodeList.PushBack(curNode.Left)
}
if curNode.Right != nil {
nodeList.PushBack(curNode.Right)
}
if count == max {
if flag {
cur = reverseSlice(cur)
}
flag = !flag
res = append(res,cur)
count = 0
max = nodeList.Len()
cur = make([]int,0)
}
}
return res
}
func reverseSlice(ori []int) []int {
for i,j := 0,len(ori)-1 ; i<j ;i,j = i+1,j-1 {
ori[i],ori[j] = ori[j],ori[i]
}
return ori
}
网友评论