您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】二叉树的翻转递归与非递归实现

2016-04-05 14:26 627 查看

二叉树的翻转也是递归的过程,左子树转到右子树,右子树转到左子树。假设有这样的一棵二叉树:



它翻转后应该是这样子的:



代码实现:
package 二叉树.翻转;

import java.util.LinkedList;

class BitNode
{
//声明一颗树的节点
char data;
BitNode LChild;
BitNode RChild;
}
public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
BitNode root=new BitNode();
createTree(root);
reverse1(root);
//reverse2(root);
pre(root);
}
/**
* 翻转二叉树非 递归实现
*
* @param root
*
* 反转后的二叉树的结构应该是这样子的
*
*     R
*    / \
*   B   A
*  	/ \
*     D   C
*/
private static void  reverse2(BitNode root) {
LinkedList<BitNode> stack=new LinkedList<BitNode>();
stack.push(root);
while(!stack.isEmpty())
{
BitNode tempRoot=stack.pop();
BitNode temp=tempRoot.LChild;
tempRoot.LChild=tempRoot.RChild;
tempRoot.RChild=temp;
if(tempRoot.LChild!=null)
{
stack.push(tempRoot.LChild);
}
if(tempRoot.RChild!=null)
{
stack.push(tempRoot.RChild);
}
}
}
/**
* 翻转二叉树递归实现
*
* @param root
*
* 反转后的二叉树的结构应该是这样子的
*
*     R
*    / \
*   B   A
*  	/ \
*     D   C
*/
private static void  reverse1(BitNode root) {
if(root!=null)
{
BitNode temp=root.LChild;
root.LChild=root.RChild;
root.RChild=temp;
reverse1(root.LChild);
reverse1(root.RChild);
}
}

/**
* 前序遍历
*
* @root
*/
public static  void pre(BitNode root)
{
if (root == null)
return;
visit(root);
pre(root.LChild);
pre(root.RChild);
}

/**
* 访问节点
* @param bit
*/
public static void visit(BitNode bit)
{
System.out.print(bit.data);
}
static BitNode[] bits=new BitNode[4];

/**
* 构造一棵二叉树
* 树的结构
*     R
*    / \
*   A   B
*  / \
* C   D
*
*/
public static void createTree(BitNode root)
{

for (int i=0;i < 4;i++)
{
bits[i] = new BitNode();
bits[i].data = (char)('A' + i);

}
root.data = 'R';
root.LChild = bits[0];
root.RChild = bits[1];
bits[0].LChild = bits[2];
bits[0].RChild = bits[3];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 二叉树 递归