码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的镜像 19

时间:2015-04-29 23:08:40      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

引言

? ?

发现二叉树的问题很多都是用递归解决的,除了按照剑指offer书中给的递归方法,自己也用栈的方法去实现了,两种方法其实深层次的思想差不多

? ?

分析问题

? ?

只要我们前序遍历,或者层次遍历二叉树,如果遇到节点就将左右子树交换,即可,递归基就是节点没有左右子树

? ?

技术分享

? ?

解决问题

? ?

利用递归方法

? ?

这里要注意Corner Case的考虑

? ?

public BinaryTreeNode mirrorRecursively(BinaryTreeNode root) {

if (root == null || (root.leftNode == null && root.rightNode == null))

return root;

// 交换左右子树

BinaryTreeNode tempBinaryTreeNode = root.leftNode;

root.leftNode = root.rightNode;

root.rightNode = tempBinaryTreeNode;

// 递归下去

if (root.leftNode != null) {

mirrorRecursively(root.leftNode);

}

if (root.rightNode != null) {

mirrorRecursively(root.rightNode);

}

return root;

}

? ?

栈的方法

? ?

栈的方法其实是模拟递归的方法,首先交换左右孩子,将根节点压入栈中,开始考虑左孩子,这时候左孩子就相当于左子树的根节点

? ?

如果左孩子不为空,那么同样交换左右孩子,将根节点压入栈中

? ?

当左孩子无法再下一层时,也就是左孩子没有左右孩子了,那么弹出栈顶元素,将考虑栈顶元素的右孩子,跟递归的思想一模一样

? ?

public BinaryTreeNode mirrorStack(BinaryTreeNode root)

{

if(root==null)

return null;

BinaryTreeNode node=root;

Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();

while(node!=null || !stack.isEmpty())

{

while(node!=null)

{

BinaryTreeNode temp=node.leftNode;????????????????????????????????

node.leftNode=node.rightNode;

node.rightNode=temp;

? ?

stack.push(node);

node=node.leftNode;

}

node=stack.pop();

node=node.rightNode;

}

return root;

}

? ?

测试代码

? ?

BinaryTreeNode root1=new BinaryTreeNode();

BinaryTreeNode node1=new BinaryTreeNode();

BinaryTreeNode node2=new BinaryTreeNode();

BinaryTreeNode node3=new BinaryTreeNode();

BinaryTreeNode node4=new BinaryTreeNode();

BinaryTreeNode node5=new BinaryTreeNode();

BinaryTreeNode node6=new BinaryTreeNode();

root1.leftNode=node1;

root1.rightNode=node2;

node1.leftNode=node3;

node1.rightNode=node4;

node2.leftNode=node5;

node2.rightNode=node6;

root1.data=8;

node1.data=6;

node2.data=10;

node3.data=5;

node4.data=7;

node5.data=9;

node6.data=11;

BinaryTreeNode root2=new BinaryTreeNode();

BinaryTreeNode a=new BinaryTreeNode();

BinaryTreeNode b=new BinaryTreeNode();

root2.leftNode=a;

root2.rightNode=b;

root2.data=8;

a.data=7;

b.data=2;

MirrorRecursively test=new MirrorRecursively();

BinaryTreeNode rootBinaryTreeNode=test.mirrorRecursively(root1);

System.out.println(root1.rightNode.leftNode.data);

? ?

二叉树的镜像 19

标签:

原文地址:http://www.cnblogs.com/keedor/p/4467590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!