劍指Offer(Java版):二叉樹的鏡像

題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像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;  
        }  
                
        
}

 

遞歸更加簡介明瞭

相關文章
相關標籤/搜索