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

题目描述:

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

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

思路一(树的先序遍历递归):

先前序遍历这颗树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换玩所有非叶节点的左、右子节点,就得到了树的镜像。

/*
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;
        TreeNode* temp=pRoot->left;
        pRoot->left=pRoot->right;
        pRoot->right=temp;
        if(pRoot->left)
            Mirror(pRoot->left);
         if(pRoot->right)
             Mirror(pRoot->right);
    }
};

补充swap版:

class Solution {
public:
    void Mirror(TreeNode *pRoot) {
    if(pRoot){
            swap(pRoot->left, pRoot->right);
            Mirror(pRoot->left);
            Mirror(pRoot->right);
        }
    }
};

思路二(非递归版):

借助stack

class Solution {
public:
    void Mirror(TreeNode *pRoot) 
    {
      if(pRoot==nullptr)
          return;
       stack stackNode;
       stackNode.push(pRoot);;
        while(stackNode.size())
        {
            TreeNode* Node=stackNode.top();
            stackNode.pop();
            if(Node->left!=nullptr||Node->right!=nullptr)
            {
                TreeNode *ptemp=Node->left;
                Node->left=Node->right;
                Node->right=ptemp;
            }
            if(Node->left)
                stackNode.push(Node->left);
            if(Node->right)
                stackNode.push(Node->right);
        }
     }
};

 

你可能感兴趣的:(剑指offer)