二叉树的镜像


  • 题目描述:

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

  • 分析:

    这个题目相对简单,既然是镜像,只要把左右交换就好了。在遍历二叉树的过程中,每遍历一个根结点,交换其左右子结点即可。显然涉及二叉树的遍历应该使用递归,接下来应该考虑的是递归的终止条件,以及程序的鲁棒性:直到遍历的结点左右子结点都为空即止。鲁棒性上需要注意的是输入为空指针的情况。

    递归版本:

    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);
        }
    }
    

    注:非递归版本可以使用队列来完成,使用层次遍历的方法。根结点入队,然后遍历队列中的结点,每出队一个结点,交换其左右结点,再将其左右结点入队(即每出队一个结点,交换完成后入队两个子结点)。

原文地址:https://www.cnblogs.com/Bill-LHR/p/6807922.html