二叉树“之”字形遍历
题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
思路:
按照剑指思路,之字形打印二叉树需要两个栈。
- 在打印某一层节点时,把下一层的节点保存到相应的栈中
- 如果当前是奇数层,则先保存左节点再保存右节点到第一个栈;
- 如果当前是偶数层,则先右节点后左节点进第二个栈。
总结:
- C++:STL双端队列deque,两端都可以进出(本例用到pop_front和push_back)
- python:列表删除头元素,list.pop(0)
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
vector<int> level_res;
if(root==nullptr)
return res;
stack<TreeNode*>levels[2];
int current = 0;
int next = 1;
levels[current].push(root);
while(!levels[0].empty() || !levels[1].empty())
{
TreeNode* pNode = levels[current].top();
levels[current].pop();
level_res.push_back(pNode->val);
if(current==0) //偶数层,从左到右
{
if(pNode->left)
levels[next].push(pNode->left);
if(pNode->right)
levels[next].push(pNode->right);
}
else //奇数层,从右到左
{
if(pNode->right)
levels[next].push(pNode->right);
if(pNode->left)
levels[next].push(pNode->left);
}
if(levels[current].empty())
{
res.push_back(level_res);
level_res.clear();
current = 1-current;
next = 1-next;
}
}
return res;
}
};
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
res = []
level_res = []
stacks = [[],[]] #类似C++中的STL数组
if root == None:
return res
current = 0
next_level = 1
stacks[current].append(root)
while len(stacks[0])!=0 or len(stacks[1])!=0:
temp = stacks[current][-1]
stacks[current].pop(-1)
level_res.append(temp.val)
if current==0:
if temp.left:
stacks[next_level].append(temp.left)
if temp.right:
stacks[next_level].append(temp.right)
else:
if temp.right:
stacks[next_level].append(temp.right)
if temp.left:
stacks[next_level].append(temp.left)
if len(stacks[current])==0:
res.append(level_res)
level_res = []
current = 1-current
next_level = 1-next_level
return res