题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
解题思路(递归):
1、前序遍历二叉树的每个结点
2、如果遍历的结点有子结点,交换它的两个子结点
3、递归交换所有非叶子结点的左右子结点
代码实现 :
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public void Mirror(TreeNode root) {
/*
解题思路:
1、前序遍历二叉树的每个结点
2、如果遍历的结点有子结点,交换它的两个子结点
3、递归交换所有非叶子结点的左右子结点
*/
//特殊情况:二叉树为空树
if(root == null){
return;
}
//特殊情况:二叉树只有根结点(叶结点)
if(root.left == null && root.right == null){
return;
}
//1、前序遍历二叉树的每个结点
//2、如果遍历的结点有子结点,交换它的两个子结点
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
//3、递归交换所有非叶子结点的左右子结点
if(root.left != null){
Mirror(root.left);
}
if(root.right != null){
Mirror(root.right);
}
}
}
效率:
解题思路(非递归):
1、前序遍历二叉树的每个结点
2、把每个结点存入到栈中
3、从栈中取出结点,如果当前结点有子结点,交换它的两个子结点
4、重复存取交换所有非叶子结点的左右子结点
代码实现:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
#include<stack>
class Solution {
public:
void Mirror(TreeNode *pRoot) {
/*
解题思路:
1、前序遍历二叉树的每个结点
2、把每个结点存入到栈中
3、从栈中取出结点,如果当前结点有子结点,交换它的两个子结点
4、重复存取交换所有非叶子结点的左右子结点
*/
if(pRoot == NULL){
return;
}
if(pRoot->left == NULL && pRoot->right == NULL){
return;
}
stack<TreeNode*> mystack;
mystack.push(pRoot);
while(!mystack.empty()){
TreeNode *currentNode = mystack.top();
mystack.pop();
if(currentNode == NULL){
continue;
}
if(currentNode->left == NULL && currentNode->right == NULL){
continue;
}
TreeNode *temp = currentNode->left;
currentNode->left = currentNode->right;
currentNode->right = temp;
mystack.push(currentNode->left);
mystack.push(currentNode->right);
}
}
};