思路:利用一个辅助队列存放每一层的元素,出队的同时再把其孩子节点存入队列。队列为空则遍历结束。
代码:
vector> levelOrder(TreeNode* root) {
queue que;
if(root!=nullptr) que.push(root);
vector> result;
while(!que.empty()){
vector vec;
int size = que.size();//该层元素固定,用size存放,否则que.size会变动
for(int i =0;i < size;i++){
TreeNode* node = que.front();
vec.push_back(node->val);
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
result.push_back(vec);//存放每一层的元素
}
return result;
}
思路:前后序遍历都可以实现,只需要把二叉树遍历访问根节点时,把左右孩子交换。
前序代码:(后序调换顺序)
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) return root;
swap(root->right,root->left);//中
invertTree(root->left);//左
invertTree(root->right);//右
return root;
}
若使用中序遍历则会麻烦一点,因为中序遍历处理完左子树,把左子树交换到右边,但此时需要处理右子树,而此时的右子树不是原本的右子树,而是处理完左子树被交换到右边的子树.总之会使左子树处理了两次。所以只需要把代码都处理左子树即可。(因为调换后,要处理的右子树实际是在左边)
正常中序处理会导致重复处理一颗子树中序代码:
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) return root;
invertTree(root->left);//左
swap(root->left,root->right);//中
invertTree(root->left);//右,实际是交换后的右子树
return root;
}
s思路:比较左右两边是否数值对称,可以利用后序遍历,左子树用左右中,右子树右左中。左子树的左孩子与右子树的右孩子比较(外侧),左子树的右孩子与右子树的左孩子作比较(内侧)。最后再返回其比较结果(根处理).因此把根处理放在最后才能返回其左右子树的比较结果。
代码:
bool compare(TreeNode* left,TreeNode* right){
if(left == nullptr && right != nullptr) return false;
else if(left != nullptr && right == nullptr) return false;
else if(left == nullptr && right == nullptr) return true;
else if(left->val != right->val) return false;
//排除了以上情况,下面就是左右节点不为空且值相同
bool outside = compare(left->left,right->right);//外侧,左子树的左边,右子树的右边作比较
bool inside = compare(left->right,right->left);//内侧,左子树右边,右子树左边作比较
return outside && inside;
}
bool isSymmetric(TreeNode* root) {
if(root == nullptr) return true;
return compare(root->left,root->right);
}