题目链接:https://leetcode.cn/problems/invert-binary-tree/
题目是翻转二叉树,即将这颗树上的所有节点的左右节点相互交换
我的思路:我们可以像二叉树的层序遍历一样,使用队列存储每一层的节点,当队列里有元素时,我们取出头部节点,如果该节点有左子节点或者右子节点,将这些存在的节点入队,此时可以定义一个中间节点,用这个中间节点来交换左右子节点。这个题也需要两层循环,第一层循环的结束条件是判断这个存放节点的队列是否为空,第二层循环是这个队列的长度。
代码:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> q;
if(root==nullptr)return nullptr;//如果头节点为空,直接返回nullptr
q.push(root);
while(!q.empty()){
int size=q.size();
while(size--){
TreeNode *temp=q.front();//取出头部节点
if(temp->left)q.push(temp->left);//如果有左子节点,入队
if(temp->right)q.push(temp->right);
TreeNode *node=temp->left;//利用中间节点来交换这个头部节点的左右子节点
temp->left=temp->right;
temp->right=node;
q.pop();//头部节点出队
}
}
return root;
}
};
时间复杂度:O(NxM) N为这棵树的深度,M为节点数
空间复杂度:O(M) M为树的节点数