Java刷題-tree

一、分別按照二叉樹先序,中序和後序打印所有的節點。

這道題就是書上的算法思想的實際使用,唯一需要特別注意到的是用遞歸的方式建樹,還是比較巧妙的,因爲一棵樹的建立過程字符流是重複使用的,用遞歸的方式對根進行循環賦值。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Tree1 {
    //建立一棵樹
    public static class Node {
        public int value;
        public Node left;
        public Node right;

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

    }

    //前序遍歷
    public static void preOrderRecur(Node head) {
        if (head == null) {
            return;
        }
        System.out.print(head.value + " ");
        preOrderRecur(head.left);
        preOrderRecur(head.right);


    }

    //中序遍歷
    public static void inOrderRecur(Node head) {
        if (head == null) {
            return;
        }
        inOrderRecur(head.left);
        System.out.print(head.value + " ");
        inOrderRecur(head.right);
    }

    //後續遍歷
    public static void posOrderRecur(Node head) {
        if (head == null) {
            return;
        }
        posOrderRecur(head.left);
        posOrderRecur(head.right);
        System.out.print(head.value + " ");
    }

    public static Node treeGenerate(BufferedReader in) throws IOException {
        String[] str = in.readLine().split(" ");
        Node root = new Node(Integer.parseInt(str[0]));
        //遞歸進行賦值
        if (Integer.parseInt(str[1]) != 0) {
            //左孩子,遞歸調用再讀一行root即爲左孩子
            root.left = treeGenerate(in);
        }
        if (Integer.parseInt(str[2]) != 0) {
            //右孩子,遞歸調用再讀一行root即爲左孩子
            root.right = treeGenerate(in);
        }
        return root;

    }

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] str1 = bf.readLine().split(" ");
        Node root = treeGenerate(bf);
        preOrderRecur(root);
        System.out.println();
        inOrderRecur(root);
        System.out.println();
        posOrderRecur(root);
    }

}

二、二叉樹的序列化

假設序列化的結果字符串爲 str,初始時 str = "",遍歷二叉樹時,遇到 null 節點,則在 str 的末尾加上 "#!",否則加上"當前的節點值!"。

輸出兩行分別表示該二叉樹的先序序列化和層序序列化

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    //建立一棵樹
    public static class Node {
        public int value;
        public Node left;
        public Node right;

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

    //先序遍歷
    public static StringBuilder preOrderRecur(Node head, StringBuilder sb) {
        if (head == null) {
            return sb.append("#!");
        }
        sb.append(head.value + "!");
        preOrderRecur(head.left, sb);
        preOrderRecur(head.right, sb);
        return sb;
    }


    //層序遍歷
    public static StringBuilder layerOrder(Node head, StringBuilder sb) {
        if (head == null) {
            sb.append("#!");
        }
        Queue<Node> queue = new LinkedList<>();
        queue.add(head);
        sb.append(head.value).append("!");
        while (!queue.isEmpty()) {
            head = queue.poll();
            if (head.left != null) {
                sb.append(head.left.value).append("!");
                queue.add(head.left);
            } else {
                sb.append("#!");
            }
            if (head.right != null) {
                sb.append(head.right.value).append("!");
                queue.add(head.right);
            } else {
                sb.append("#!");
            }
        }
        return sb;
    }

    public static Node treeGenerate(BufferedReader in) throws IOException {
        String[] str = in.readLine().split(" ");
        Node root = new Node(Integer.parseInt(str[0]));
        //遞歸進行賦值
        if (Integer.parseInt(str[1]) != 0) {
            //左孩子,遞歸再調用
            root.left = treeGenerate(in);
        }
        if (Integer.parseInt(str[2]) != 0) {
            //右孩子,遞歸再調用
            root.right = treeGenerate(in);
        }
        return root;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] str1 = bf.readLine().split(" ");
        Node root = treeGenerate(bf);
        StringBuilder res1 = new StringBuilder();
        res1=preOrderRecur(root,res1);
        System.out.println(res1);
        StringBuilder res2 = new StringBuilder();
        res2 = layerOrder(root,res2);
        System.out.println(res2);
    }

}

這題目用String就是超時,必須要用StringBuilder。注意一下層序遍歷是通過一個queue來存儲的

感覺需要補充一下jvm的知識了。

 

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