层序遍历
如何能一层层按顺序遍历呢?可以用队列先进先出的特性,对每一层进入队列的元素计数,然后再一层层弹出。这种方式也存在于图论的广度优先搜索。
n叉树的遍历
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> result;
deque<Node*> deq;
if(root==NULL) return result;//?
deq.push_back(root);
while(!deq.empty()){
int size=deq.size();
vector<int> vec;
while(size--){
Node* node=deq.front();
vec.push_back(node->val);
deq.pop_front();
for(int i=0;i<node->children.size();i++){
deq.push_back(node->children[i]);
}
}
result.push_back(vec);
}
return result;
}
};
226.翻转二叉树
前序和后序遍历都可以,但是中序不可以,左中右的顺序,会让本来换好顺序的左子树,经过中结点的swap处理,换到右边去,下一次对右子树处理时,又把之前的左子树反转回去,最后的效果相当于没变化。
class Solution {
public:
void reverse(TreeNode* curNode){
if(curNode==nullptr) return;
swap(curNode->left,curNode->right);
reverse(curNode->left);
reverse(curNode->right);
}
TreeNode* invertTree(TreeNode* root) {
reverse(root);
return root;
}
};