二叉樹翻轉的遞歸與非遞歸實現(Java)

二叉樹的翻轉,即以根所在垂直線爲對稱線,對稱位置的兩個節點進行交換。

實現這種算法,可以有兩種思路,即遞歸和非遞歸(棧)。

下面給出Java代碼實現。

import java.util.Stack;

/**
 * Created by Lee on 2017/11/11.
 */
//樹節點
class Node {
    int value;
    Node left;
    Node right;

    Node(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                ", left=" + left +
                ", right=" + right +
                '}';
    }
}
public class InvertBinaryTreeDemo {

    public static void swap(Node root){
        Node temp = root.left;
        root.left = root.right;
        root.right = temp;
    }

    //遞歸實現
    public static Node invert(Node root){
        if (root == null){
            return null;
        }
        root.left = invert(root.left);
        root.right = invert(root.right);
        swap(root);
        return root;
    }

    //非遞歸,用棧實現
    public static void invertByStack(Node root){
        Stack<Node> stack = new Stack<Node>();
        stack.push(root);
        while (!stack.empty()){
            Node node = stack.pop();
            swap(node);
            if (node.left != null){
                stack.push(node.left);
            }
            if (node.right != null){
                stack.push(node.right);
            }
        }
    }

    //測試
    public static void main(String[] args) {
        Node node0 = new Node(1);
        Node node1 = new Node(2);
        Node node2 = new Node(3);
        Node node3 = new Node(4);
        Node node4 = new Node(5);
        Node node5 = new Node(6);
        Node node6 = new Node(7);
        node0.left = node1;
        node0.right = node2;
        node1.left = node3;
        node1.right = node4;
        node2.left = node5;
        node2.right = node6;
        //invertByStack(node0);
        //invert(node0);
        System.out.println(node0);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章