27 二叉树镜像(四-画图让抽象问题形象化)
题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
测试用例:
1)功能测试(普通的二叉树;二叉树的所有节点都没有左子树或者右子树;只有一个节点的二叉树)
2)特殊输入测试(二叉树的根节点为nullptr)
解题思路:
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 == nullptr) return; //不加下面的判断,程序也能通过。加上以后会少执行两个空指针之间的交换步骤。 if(pRoot->left==nullptr && pRoot->right==nullptr) return; //返回值是void,因此在原树上镜像 //交换当前根节点的左右子树 TreeNode * tempTree = nullptr; tempTree = pRoot->left; pRoot->left = pRoot->right; pRoot->right = tempTree; if(pRoot->left!=nullptr) Mirror(pRoot->left); if(pRoot->right!=nullptr) Mirror(pRoot->right); } };
2)不使用临时变量交换,使用函数swap
class Solution { public: void Mirror(TreeNode *p) { if(p){ swap(p -> left, p -> right); Mirror(p -> left); Mirror(p -> right); } } };
3)栈的非递归实现
class Solution { public: void Mirror(TreeNode *pRoot) { //非递归实现 if(pRoot==NULL) return; stack<TreeNode*> stackNode; stackNode.push(pRoot); while(stackNode.size()){//不为空,说明左右子树至少有一个存在 TreeNode* tree=stackNode.top(); stackNode.pop(); if(tree->left!=NULL || tree->right!=NULL){//至少有一个存在,交换 TreeNode *ptemp=tree->left; tree->left=tree->right; tree->right=ptemp; } if(tree->left) stackNode.push(tree->left); if(tree->right) stackNode.push(tree->right); } } };
4)队列的非递归实现 (与栈的非递归原理一样,只是交换的顺序有所不同stack先进后出queue先进先出)
void Mirror(TreeNode *pRoot) { if (pRoot == NULL)return; queue<TreeNode*> qu; TreeNode* p = NULL; qu.push(pRoot); while (qu.size()) { p = qu.front(); qu.pop(); swap(p->left, p->right); if (p->left)qu.push(p->left); if (p->right)qu.push(p->right); } }