0
点赞
收藏
分享

微信扫一扫

LeetCode 226. 翻转二叉树


文章目录

  • ​​递归解法​​
  • ​​DFS迭代法​​
  • ​​BFS迭代法​​


LeetCode 226. 翻转二叉树_leetcode


交换每个节点的左右孩子即可

递归解法

class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr){
return nullptr;
}
TreeNode* tmp = invertTree(root->left);
root->left = invertTree(root->right);
root->right = tmp;
return root;
}
};

LeetCode 226. 翻转二叉树_深度优先_02


此时代码中调用两次invertTree返回的都是NULL,就是用三行代码交换了三次NULL,最后返回1这个节点

LeetCode 226. 翻转二叉树_迭代法_03


root为2时,1和3分别返回该节点的地址,即tmp记录了节点1的地址,用root->left接受了节点3的地址,然后用tmp给root->right赋值,这样就完成了交换

LeetCode 226. 翻转二叉树_算法_04


同上,2和7的子节点完成了交换,给父节点4返回自己的地址,用同样的方法完成了交换

DFS迭代法

递归法是下方节点先交换,上方节点后交换

迭代法则是按照先序遍历的方式,从上到下进行交换,下方交换完了,再到两一侧的子树进行交换

TreeNode* invertTree(TreeNode* root) {
if(root == nullptr){
return nullptr;
}
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* top = st.top();
st.pop();
swap(top->left, top->right);
if(nullptr != top->left) {
st.push(top->left);
}
if(nullptr != top->right) {
st.push(top->right);
}
}
return root;
}

BFS迭代法

TreeNode* invertTree(TreeNode* root) {
if(root == nullptr){
return nullptr;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* front = q.front();
q.pop();
swap(front->left, front->right);
if(nullptr != front->left) {
q.push(front->left);
}
if(nullptr != front->right) {
q.push(front->right);
}
}
return root;
}

只要每个节点都遍历到,交换两个孩子节点即可


举报

相关推荐

0 条评论