題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像java
樹的鏡像是一個比較新的概念,咱們未必可以一會兒相出求樹的鏡像的方法。爲了可以造成直觀的印象,咱們能夠本身畫一棵二叉樹,而後根據鏡子的經驗畫出它的鏡像。
如圖所示:右邊的二叉樹就是左邊的樹的鏡像node
仔細分析這兩棵樹的特色,看看能不能總結出求鏡像的步驟。這兩棵樹的根節點相同,但他們的左右兩個子節點交換了位置。所以咱們不妨先在樹中交換根節點的兩個子節點,就獲得了下面的第二顆樹函數
交換根節點的兩個子節點以後,咱們注意到值爲10,6的結點的子節點仍然保持不變,所以咱們還須要交換這兩個結點的左右子節點。交換以後的結果分別爲第三課樹和第四顆樹。作完這兩次交換以後,咱們已經遍歷完全部的非葉子結點。此時交換以後的樹恰好就是原始樹的鏡像。.net
總結上面的過程,咱們得出求一棵樹的鏡像的過程:咱們先前序遍歷這棵樹的每一個結點,若是遍歷的結點有子節點,就交換它的兩個子節點,當交換完全部的非葉子結點的左右子節點以後,咱們就獲得了鏡像。遞歸
用Java代碼實現:get
循環方式:class
package cglib;test
import java.util.Stack;import
class BinaryTreeNode{
int data;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
} 二叉樹
public class DeleteNode {
public static void main(String[] args) {
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;
node4.leftNode=node5;
node4.rightNode=node6;
root1.data=8;
node1.data=6;
node2.data=10;
node3.data=5;
node4.data=7;
node5.data=9;
node6.data=11;
DeleteNode test=new DeleteNode();
BinaryTreeNode rootBinaryTreeNode=test.mirrorBinaryTree(root1);
System.out.println(root1.rightNode.rightNode.data);//5
}
public BinaryTreeNode mirrorBinaryTree(BinaryTreeNode root){
if(root==null){
return null;
}
Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();
stack.push(root);//將8壓進棧中
while(!stack.isEmpty()){
root=stack.pop();//8出棧
if(null != root.leftNode || null != root.rightNode) {
BinaryTreeNode temp=root.leftNode;
root.leftNode=root.rightNode;
root.rightNode=temp;//6,10變成10,6,10下面的9,7變成7,9
}
if(null != root.leftNode )
stack.push(root.leftNode); //壓入10
if(null != root.rightNode)
stack.push(root.rightNode); //壓入6
}
return root;
}
}
輸出 5
或者下面這個循環,先左後右更清晰些
public BinaryTreeNode mirrorBinaryTree(BinaryTreeNode root){
if(root==null){
return null;
}
if(root.leftNode==null&&root.rightNode==null)
return null;
Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();
while(root!=null||!stack.isEmpty()){
while(root!=null){
BinaryTreeNode temp=root.leftNode;
root.leftNode=root.rightNode;
root.rightNode=temp;
stack.push(root);
root=root.leftNode;
}
root=stack.pop();
root=root.rightNode;
}
return root;
}
遞歸方式:
package cglib;
import java.util.Stack;
class BinaryTreeNode{
int data;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
}
public class DeleteNode {
public static void main(String[] args) {
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;
node4.leftNode=node5;
node4.rightNode=node6;
root1.data=8;
node1.data=6;
node2.data=10;
node3.data=5;
node4.data=7;
node5.data=9;
node6.data=11;
DeleteNode test=new DeleteNode();
BinaryTreeNode rootBinaryTreeNode=test.mirrorBinaryTree(root1);
System.out.println(root1.rightNode.rightNode.data);//5
}
public BinaryTreeNode mirrorBinaryTree(BinaryTreeNode root){
if(root == null)
return null;
if(root.leftNode == null && root.rightNode == null)
return null;
BinaryTreeNode temp = root.leftNode;
root.leftNode = root.rightNode;
root.rightNode = temp;
if(root.leftNode != null)
mirrorBinaryTree(root.leftNode);
if(root.rightNode != null)
mirrorBinaryTree(root.rightNode);
return root;
}
}
遞歸更加簡介明瞭