剑指offer-二叉树的镜像
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
思路:
通过看输入描述,应该能看出来,解法就是根节点不变,子树下的每个根节点,左右子树
反过来,很明显用递归来解是最简单的。
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) {
// 递归终止条件
if(root == null)
return ;
// 根节点的左右子树互换位置
TreeNode tempNode = root.right;
root.right = root.left;
root.left = tempNode;
// 递归左子树,左子树除根节点,左右子树互换
Mirror(root.left);
// 递归右子树,右子树除根节点,左右子树互换
Mirror(root.right)
}
//栈的非递归
void Mirror(TreeNode *pRoot) {
if (pRoot == NULL)return;
stack<TreeNode*> st;
TreeNode* p = NULL;
st.push(pRoot);
while (st.size())
{
p = st.top();
st.pop();
swap(p->left, p->right);
if (p->left)st.push(p->left);
if (p->right)st.push(p->right);
}
} //队列的非递归
void Mirror(TreeNode *pRoot) {
if (pRoot == NULL)return;
queue<TreeNode*> qu;
TreeNode* p = NULL;
qu.push(pRoot);
while (qu.size())
{
p = qu.front();
qu.pop();
swap(p->left, p->right);
if (p->left)qu.push(p->left);
if (p->right)qu.push(p->right);
}
}
}