剑指offer——面试题19:二叉树的镜像

来源:互联网 发布:网络电视 直播软件 编辑:程序博客网 时间:2024/06/10 13:36

    题目:操作给定的二叉树,将其变换为源二叉树的镜像。

二叉树的镜像定义:源二叉树         8       /  \      6   10     / \  / \    5  7 9 11    镜像二叉树        8       /  \      10   6     / \  / \    11 9 7  5

    代码1:递归方法

/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}};*/class Solution {public:    void Mirror(TreeNode *pRoot) {        if(pRoot == NULL)    // 对于函数返回值为空的,当根结点为空时,直接 return             return;       // if(pRoot->left == NULL||pRoot->right == NULL)        if(pRoot->left == NULL&&pRoot->right == NULL)  // 左右子树都为空的情况            return;        TreeNode *pTemp = pRoot->left;        pRoot->left = pRoot->right;        pRoot->right = pTemp;                if(pRoot->left)            Mirror(pRoot->left);        if(pRoot->right)            Mirror(pRoot->right);    }

    分析:先序遍历这棵树,如果遍历到的结点有子节点,就交换它的子结点。当交换完所有的非叶子结点的左右子结点以后,就得到了树的镜像。

    代码2:非递归方法(vector + swap())

void Mirror(TreeNode *pRoot) {        if (!pRoot) return;        vector<TreeNode*> vv;        vv.push_back(pRoot);        while (!vv.empty()) {            vector<TreeNode*> t;            for (auto &i : vv) {                swap(i->left, i->right);                if (i->left) t.push_back(i->left);                if (i->right) t.push_back(i->right);            }            vv.swap(t);        }    }
  

    分析:比较好理解,不赘述了。

    代码3:非递归方法(队列)

    void Mirror(TreeNode *pRoot)  {      queue<TreeNode *> q;      TreeNode *pointer = pRoot;//当前处理的节点为根节点      while (pointer)      {          swap(pointer->left, pointer->right);//交换当前处理节点的孩子          if (pointer->left)//左孩子不为空              q.push(pointer->left);          if (pointer->right)//右孩子不为空              q.push(pointer->right);          if (!q.empty())          {              pointer = q.front();              q.pop();          }          else          {              break;          }      }  }

    分析:我们按照广度遍历二叉树的顺序,逐个处理遍历的节点。当处理的当前节点,如果有孩子节点,我们交换它们的孩子节点,并且把它们的非空孩子入队列。处理完当前节点以后,我们下一次处理队头的节点。

    代码4:非递归方法(栈)

    void Mirror(TreeNode *pRoot)  {      if (pRoot == NULL)//如果处理的空树,我们直接返回          return;      stack<TreeNode*> s;//创建一个栈      s.push(pRoot);      TreeNode *pointer = NULL;      while (!s.empty())      {          pointer = s.top();//取出栈顶元素          s.pop();          if (pointer->left != NULL || pointer->right != NULL)//非叶子节点          {              swap(pointer->left,pointer->right);//交换其左右孩子          }          if (pointer->left != NULL)//非空左子树入栈              s.push(pointer->left);          if (pointer->right != NULL)//非空右子树入栈              s.push(pointer->right);      }  }

    分析:我们也可以按照先序遍历二叉树的顺序,非递归的实现二叉树的镜像操作,每遇到一个节点,判断当前节点是否有孩子,如果有孩子,我们交换其左右孩子,然后把非空孩子入栈。直到队列为空。


原创粉丝点击