翻转二叉树

力扣题目链接(opens new window)

翻转一棵二叉树。

226.翻转二叉树

这道题目背后有一个让程序员心酸的故事,听说 Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。(真假不做判断,权当一个乐子哈)

思路

使用一种二叉树的遍历方法遍历,然后翻转每个节点的子节点即可

代码

前序遍历(迭代)
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        //先定义一个栈
        stack<TreeNode*> st;
        //检测传入节点是否为空
        if(root == NULL) return 0;
        //将根节点压栈
        st.push(root);//中
        //当栈中不为空时持续遍历
         while(!st.empty()){
             TreeNode* node = st.top();
             st.pop();
             swap(node->left, node->right);
              //判断当前节点有无左右子节点,有就按顺序压栈(明确你的出栈顺序,入栈时要相反)
             if(node->right)st.push(node->right); //右
             if(node->left)st.push(node->left);   //左 
         }
        return root;
    }
};
前序遍历(递归)
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root == NULL) return root;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);

        return root;
    }
};
层序遍历
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode*> que;
        if(root != NULL) que.push(root);
        while(!que.empty()){
            int size = que.size();
            while(size--){
                TreeNode* node = que.front();
                que.pop();
                swap(node->left, node->right);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return root;
    }
};