LeetCode103 Binary Tree Zigzag Level Order Traversal 二叉树Zigzag层级遍历

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,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

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

题源:here;完整实现:here

思路:

其实同第102题一样 ,我们也是一层一层的遍历,只是这一次使用迭代的方式(上一题使用的是递归),但是再输出的时候每层的顺序有变化。我首先想到的是用双向链表,后来发现:我在输出的时候改变方向不就好了吗。。。

1 双向链表

vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
	vector<vector<int>> vv;
	deque<TreeNode*> records;
	if(root) records.push_front(root);
	TreeNode *last = root;
	int layer = 1;
	while (records.size()){
		TreeNode *curr;
		if (vv.size() < layer) vv.push_back({});
		if (layer % 2){
			curr = records.front();
			records.pop_front();
			vv[layer - 1].push_back(curr->val);
			if (curr->left) records.push_back(curr->left);
			if (curr->right) records.push_back(curr->right);
		}
		else{
			curr = records.back();
			records.pop_back();
			vv[layer - 1].push_back(curr->val);
			if (curr->right) records.push_front(curr->right);
			if (curr->left) records.push_front(curr->left);
		}
		if (last == curr && records.size()){
			layer++;
			last = layer % 2 ? records.back() : records.front();
		}
	}
	return vv;
}

2 直接改变输出

vector<vector<int>> zigzagLevelOrder2(TreeNode* root) {
	vector<vector<int>> vv;
	queue<TreeNode*> records;
	if (root) records.push(root);
	TreeNode *last = root;
	int layer = 1;
	while (records.size()){
		TreeNode *curr = records.front();
		records.pop();
		if (vv.size() < layer) vv.push_back({});
		vv[layer - 1].insert(layer % 2 ? vv[layer - 1].end() : vv[layer - 1].begin(), curr->val);
		if (curr->left) records.push(curr->left);
		if (curr->right) records.push(curr->right);
		if (curr == last && records.size()){
			layer++;
			last = records.back();
		}
	}
	return vv;
}

但是两种方式的速度是一样的,纪念贴图:

猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/81073555