-
题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
-
分析:
这个题目相对简单,既然是镜像,只要把左右交换就好了。在遍历二叉树的过程中,每遍历一个根结点,交换其左右子结点即可。显然涉及二叉树的遍历应该使用递归,接下来应该考虑的是递归的终止条件,以及程序的鲁棒性:直到遍历的结点左右子结点都为空即止。鲁棒性上需要注意的是输入为空指针的情况。
递归版本:
void Mirror(TreeNode *pRoot) { if(pRoot == NULL) return; if(pRoot->left == NULL && pRoot->right == NULL) return; TreeNode *pNode = NULL; pNode = pRoot->left; pRoot->left = pRoot->right; pRoot->right = pNode; if(pRoot->left != NULL) Mirror(pRoot->left); if(pRoot->right != NULL) Mirror(pRoot->right); }
非递归版本:
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); } }
注:非递归版本可以使用队列来完成,使用层次遍历的方法。根结点入队,然后遍历队列中的结点,每出队一个结点,交换其左右结点,再将其左右结点入队(即每出队一个结点,交换完成后入队两个子结点)。
晚来天欲雪,能饮一杯无?