226Invert Binary Tree

来源:互联网 发布:网络贷款 申请流程 编辑:程序博客网 时间:2024/04/30 14:58

Invert a binary tree.

     4   /   \  2     7 / \   / \1   3 6   9
to
     4   /   \  7     2 / \   / \9   6 3   1
Trivia:
This problem was inspired by this original tweet by Max Howell:

解析:左右翻转二叉树,记得有一个题目左右镜像树,与此题目的解题思路类似。左右翻转二叉树交换左右子树即可。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    //solve1    /*TreeNode* invertTree(TreeNode* root)     {        if (root == NULL)            return NULL;        TreeNode *temp = root -> left;        root -> left = root -> right;        root -> right = temp;        invertTree(root -> left);        invertTree(root -> right);        return root;    }*/       //solve2    /*TreeNode* invertTree(TreeNode* root)     {        if (root == NULL)            return NULL;        TreeNode *temp = root -> left;        root -> left = invertTree(root -> right);        root -> right = invertTree(temp);        return root;    }*/        //solve3 use nonrecurse    /*TreeNode* invertTree(TreeNode *root)    {        queue<TreeNode*> que;        if (root)            que.push(root);        while (!que.empty())        {            TreeNode *top = que.front();            que.pop();            if (top -> left)                que.push(top -> left);            if (top -> right)                que.push(top -> right);            TreeNode *temp = top -> left;            top -> left = top -> right;            top -> right = temp;        }        return root;    }*/        //solve4     TreeNode* invertTree(TreeNode *root)    {        if (root == NULL)            return root;        swap(root -> left, root -> right);        invertTree(root -> left);        invertTree(root -> right);        return root;    }};

solve1和solve2使用递归方法,每次调换左右子树后,又对左右子树做递归。

solve3使用非递归方法,对二叉树进行BFS,对根结点进行左右子树调换后,使用队列保存需要翻转(非NULL)的子树根结点。

solve4主要是对根结点左右的调换使用swap(TreeNode* &a, TreeNode* &b), 起初我以为这样的写法会报错,后来慢慢尝试发现可以使用。swap(root -> left, root -> right), 只是交换了root这个节点中left指针和right指针的值,是left指针指向right之前指向的对象,right指针指向left之前指向的对象,不管这个对象是非空还是空,都是成立的。


0 0