劍指offer--面試題19:二叉樹的映象--Java實現
阿新 • • 發佈:2019-01-29
題目描述:
請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。
解題思路:
我們先前序遍歷這棵樹的每個結點,如果這個結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點後,就得到了樹的映象。
這裡採用了遞迴方式和非遞迴方式。
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);
}
}
測試資料如下圖