自己的思路:通过画图,可知二叉树的镜像如下图所示:
根据画图可得到这样的思路:先序遍历树的每个结点,若遍历到的结点有子结点,则交换它的两个子结点。
有两种实现方法:
1.递归实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode invertTree(TreeNode root) {
if(root!=null){
treeTraverse(root);
return root;
}else
return null;
}
private void treeTraverse(TreeNode root){
if(root.left!=null||root.right!=null){
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
}
if(root.left!=null){
treeTraverse(root.left);
}
if(root.right!=null){
treeTraverse(root.right);
}
}
}
2.非递归实现,即使用循环实现(要能想到非递归其实要用到栈来实现)
void MirrorNonRecurively(BinaryTreeNode *pNode)
{
if(NULL == pNode)
return;
stack<BinaryTreeNode *> stackTreeNode;
stackTreeNode.push(pNode);
while(stackTreeNode.size())
{
BinaryTreeNode *pNode = stackTreeNode.top();
stackTreeNode.pop();
if(NULL != pNode->Left || NULL != pNode->Right)
{
BinaryTreeNode *pTemp = pNode->Left;
pNode->Left = pNode->Right;
pNode->Right = pTemp;
}
if(NULL != pNode->Left)
stackTreeNode.push(pNode->Left);
if(NULL != pNode->Right)
stackTreeNode.push(pNode->Right);
}
}