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

(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;
        
        else
        {
            //pRoot->left和pRoot->right两指针交换内存中的指向
           TreeNode* temp=pRoot->left;    
            pRoot->left=pRoot->right;
            pRoot->right=temp;
        }
        
        Mirror(pRoot->left);
        Mirror(pRoot->right);
 
    }
};
(2)本题扩展:非递归实现一和非递归实现先序遍历相同
if (pRoot ==nullptr)
	   return;
	stack<TreeNode*> s;//创建一个栈
	s.push(pRoot);
	TreeNode *pointer = nullptr;
	while (!s.empty())
	{
		pointer = s.top();//取出栈顶元素
		s.pop();
		if (pointer->left != nullptr || pointer->right != nullptr)//非叶子节点
		{
			swap(pointer->left,pointer->right);//交换其左右孩子
		}
		if (pointer->left != nullptr)//非空左子树入栈
			s.push(pointer->left);
		if (pointer->right != nullptr)//非空右子树入栈
			s.push(pointer->right);
	}
    }
};

非递归实现二

非递归的思想:我们按照广度遍历二叉树的顺序,逐个处理遍历的节点。当处理的当前节点,如果有孩子节点,我们交换它们的孩子节点,并且把它们的非空孩子入队列。处理完当前节点以后,我们下一次处理队头的节点。

void mirror01(BinaryTreeNode *&root)
{
	queue<BinaryTreeNode *> q;
	BinaryTreeNode *pointer = root;//当前处理的节点为根节点
	while (pointer)
	{
		swap(pointer->left, pointer->right);//交换当前处理节点的孩子
		if (pointer->left)//左孩子不为空
			q.push(pointer->left);
		if (pointer->right)//右孩子不为空
			q.push(pointer->right);
		if (!q.empty())
		{
			pointer = q.front();
			q.pop();
		}
		else
		{
			break;
		}
	}

参考:https://blog.csdn.net/yang20141109/article/details/50857648

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/81025843