算法题22 树的镜像

题目

  完成一个函数,输入一个二叉树,构建它的镜像二叉树

分析

  这个题目最直观的解法是递归,交换左右子树(即交换左右孩子)。

代码

 1 void MirrorTree(TreeNode* root)
 2 {
 3     if (!root)
 4         throw std::exception("Invalid input.");
 5 
 6     //swap the left and right subtree
 7     TreeNode* tmp=root->pLeft;
 8     root->pLeft=root->pRight;
 9     root->pRight=tmp;
10 
11     //recursion
12     if (root->pLeft)
13         MirrorTree(root->pLeft);
14     if (root->pRight)
15         MirrorTree(root->pRight);
16 
17 }

  也可以用非递归的方式去解决,借鉴分层遍历的思路,借助一个双向队列,分层遍历这个二叉树,在遍历的过程中交换每个节点的左右孩子即可

 1 void MirrorTree1(TreeNode* root)
 2 {
 3     if (!root)
 4         throw std::exception("Invalid input.");
 5 
 6     deque<TreeNode*> dq;
 7     TreeNode* node;
 8     dq.push_back(root);
 9     while (dq.size()>0)
10     {
11         node=dq.front();
12         
13         if (node->pLeft==NULL&&node->pRight==NULL)
14         {
15             dq.pop_front();
16             continue;
17         }
18         TreeNode* tmp=node->pLeft;
19         node->pLeft=node->pRight;
20         node->pRight=tmp;
21 
22         if(node->pLeft)
23             dq.push_back(node->pLeft);
24         if(node->pRight)
25             dq.push_back(node->pRight);
26         dq.pop_front();
27     }
28 }
原文地址:https://www.cnblogs.com/wangzaizhen/p/5196225.html