剑指offer--算法题--20--二叉树的镜像

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。 

输入描述:

二叉树的镜像定义:源二叉树

        8

       /  \

      6   10

     / \  / \

     5  7 9 11

     镜像二叉树

        8

       /  \

      10   6

     / \  / \

     11 9 7  5

其实就是交换二叉树的左右子树,可用递归实现:

交换根节点的左右孩子,再分别对左孩子进行镜像和右孩子进行镜像

这是关于方法二的解析,如果懂栈的可以直接略过,不懂得可以看一看。


package jzoffer;

import java.util.LinkedList;

import javax.swing.tree.TreeNode;

public class MirrorTest {
	public static void Mirror1(NewTreeTest root){
		if(root == null){
			return;
		}else{
			System.out.print(root.data+" ");
			NewTreeTest temp = root.leftTree;
			root.leftTree    = root.rightTree;
			root.rightTree   = temp;
			Mirror1(root.leftTree);
			Mirror1(root.rightTree);
		}
	}
	
	public static void Mirror2(NewTreeTest root){
		if(root == null){
			return ;
		}
		LinkedList<NewTreeTest> stack = new LinkedList<NewTreeTest>();
		NewTreeTest current = null;
		NewTreeTest temp = null;
		stack.push(root);
		while(!stack.isEmpty()){
			current = stack.pop();
			System.out.println(current.data+" ");
			System.out.println("执行了几次?");
			while(current.leftTree != null || current.rightTree != null){
				temp = current.leftTree;
				current.leftTree = current.rightTree;
				current.rightTree = temp;
			}
			if(current.leftTree != null){
				stack.push(current.leftTree);
			}
			if(current.rightTree != null){
				stack.push(current.rightTree);
			}
		}
	}
	public MirrorTest() {
	}
	public static void main(String[] args) {
		NewTreeTest newTree1 = new NewTreeTest(1);
		NewTreeTest newTree2= new NewTreeTest(2);
		NewTreeTest newTree3 = new NewTreeTest(3);
		NewTreeTest newTree4 = new NewTreeTest(4);
		NewTreeTest newTree5 = new NewTreeTest(5);
		NewTreeTest newTree6 = new NewTreeTest(6);
		NewTreeTest newTree7 = new NewTreeTest(7);
		newTree1.leftTree = newTree2;
		newTree1.rightTree = newTree3;
		newTree2.leftTree = newTree4;
		newTree2.rightTree = newTree5;
		newTree3.leftTree = newTree6;
		newTree3.rightTree = newTree7;
		System.out.println("下面是第一棵树:");
		System.out.println("     1     ");
		System.out.println("  2     3  ");
		System.out.println("4   5 6   7");
		System.out.println("下面是第一棵树的镜像:");
		System.out.println("     1     ");
		System.out.println("  3     2  ");
		System.out.println("7   6 5   4");
		System.out.println("镜像之后的输出(注意 这个是镜像之后的前序输出 )");
		Mirror1(newTree1);//这是递归之后的输出
//		Mirror2(newTree1);//这个是非递归的输出
	}
}

class NewTreeTest{
	int data;
	NewTreeTest leftTree  = null; 
	NewTreeTest rightTree = null;
	
	public NewTreeTest(int data){
		this.data = data;
		this.leftTree = null;
		this.rightTree = null;
	}
}

结果图如下:


猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/80518394