1. 程式人生 > >劍指offer--面試題19:二叉樹的映象--Java實現

劍指offer--面試題19:二叉樹的映象--Java實現

題目描述:
請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。

解題思路:
我們先前序遍歷這棵樹的每個結點,如果這個結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點後,就得到了樹的映象。

這裡採用了遞迴方式和非遞迴方式。


import java.util.Stack;


public class MirrorRecursivelyTest {

    static class Node{
        int key;
        Node left;
        Node right;

        Node(int key){
            this
.key = key; } } public static void mirrorRecursively(Node root){ if(root == null){ return; } if(root.left == null && root.right == null){ return; } Node node = root.left; root.left = root.right; root.right = node; if
(root.left != null){ mirrorRecursively(root.left); } if(root.right != null){ mirrorRecursively(root.right); } } //非遞迴實現,要藉助棧 public static void mirrorNoneRecurvisely(Node root){ Stack<Node> stack = new Stack<Node>(); stack.add(root); while
(!stack.isEmpty()){ Node node = stack.pop(); if(node.left != null || node.right != null){ Node tmp = node.left; node.left = node.right; node.right = tmp; } if(node.left != null){ stack.push(node.left); } if(node.right != null){ stack.push(node.right); } } } //列印樹 public static void printTree(Node node){ if(node == null){ return; } System.out.println(node.key); printTree(node.left); printTree(node.right); } public static void main(String[] args) { Node root = new Node(8); Node node8 = new Node(8); Node node7 = new Node(7); root.left = node8; root.right = node7; Node node9 = new Node(9); node8.left = node9; Node node2 = new Node(2); node8.right = node2; Node node4 = new Node(4); Node node72 = new Node(7); node2.left = node4; node2.right = node72; //mirrorRecursively(root); mirrorNoneRecurvisely(root); printTree(root); } }

測試資料如下圖
這裡寫圖片描述