數據結構-二叉樹(先序+中序,中序+後序建立二叉樹遞歸實現)

 

文章目錄

 

思路

爲何先序+中序,或者中序+後序能夠創造一顆二叉樹?java

由於先序能夠知道這顆樹的根,後序也能夠知道這顆樹的根,那麼再去看中序,中序的根就找到了,中序根左邊的子樹是左子樹,中序根右邊的是右子樹,也就是說經過先序先肯定根,而後中序找到根與左右子樹,而後對左子樹遞歸找根,對右子樹遞歸找根,一直找不到爲止node

遞歸的思路是什麼呢?數組

以先序+中序舉例,先序先找到根,而後中序能夠劃分出左子樹+根+右子樹的形式,而後咱們能夠輕鬆拿到中序左子樹的數組和中序右子樹的數組,咱們知道根據一個樹的先序+中序能夠很快在中序中肯定根在哪,因此咱們如今已經有了中序的左子樹和右子樹,而且他們都是按照中序的規則,那先序的根的左子樹和右子樹序列在哪呢?依然在原先序序列中找,既然咱們已經在中序中找到了左子樹和右子樹序列,那麼在先序中就很容易找出,由於要知道先序序列知足前面是根,中間一部分是左子樹,最後一塊是右子樹的形式,中序知足最左邊一塊是左子樹,中間根,右邊右子樹,後序的話左邊是左子樹,中間右子樹,最後是根。
咱們經過對中序的左子樹遞歸找根,中序的右子樹遞歸找根,一直到結點爲 null 返回爲止ide

Java 實現
// 結點
class Node {
    int data;
    Node left = null;
    Node right = null;
}

// 二叉樹
public class BinaryTree {
    // 根結點
    private Node root;
    // 輸入的數組
    private int[] arr_in;
    // 輸出的數組
    private int[] arr_out;
    // 記錄數組下標
    private static int index;
    
    // 初始化
    public BinaryTree(int[] arr) {
        root = new Node();
        this.arr_in = arr;
        arr_out = new int[arr.length];
        index = 0;
    }

	// 根據先序遍歷和中序遍歷建立二叉樹
    public Node createByPreAndIn(int[] preArr, int[] inArr) {
        if (preArr.length > 0) {
            Node node = new Node();
            node.data = preArr[0];

            int i;
            for (i = 0; preArr[0] != inArr[i]; i++) ;

            // 中序左子樹
            int[] leftInArr = new int[i];
            // 中序右子樹
            int[] rightInArr = new int[inArr.length - i - 1];
            // 先序左子樹
            int[] leftPreArr = new int[i];
            // 先序右子樹
            int[] rightPreArr = new int[inArr.length - i - 1];

            System.arraycopy(inArr, 0, leftInArr, 0, leftInArr.length - 1);
            System.arraycopy(inArr, i + 1, rightInArr, 0, rightInArr.length - 1);
            System.arraycopy(preArr, 1, leftPreArr, 0, leftPreArr.length - 1);
            System.arraycopy(preArr, i + 1, rightInArr, 0, rightPreArr.length - 1);

            node.left = createByPreAndIn(leftPreArr, leftInArr);
            node.right = createByPreAndIn(rightPreArr, rightInArr);
            
            return node;
        }
        else
            return null;
    }

    // 根據中序遍歷和後序遍歷建立二叉樹
    public Node createByInAndPost(int[] inArr, int[] postArr) {
        if (inArr.length > 0) {
            Node node = new Node();
            node.data = postArr[postArr.length];

            int i;
            for (i = 0; postArr[postArr.length] != inArr[i]; i++) ;

            // 中序左子樹
            int[] leftInArr = new int[i];
            // 中序右子樹
            int[] rightInArr = new int[inArr.length - i - 1];
            // 後序左子樹
            int[] leftPostArr = new int[i];
            // 後序右子樹
            int[] rightPostArr = new int[inArr.length - i - 1];

            System.arraycopy(inArr, 0, leftInArr, 0, leftInArr.length - 1);
            System.arraycopy(inArr, i + 1, rightInArr, 0, rightInArr.length - 1);
            System.arraycopy(postArr, 0, leftPostArr, 0, leftPostArr.length - 1);
            System.arraycopy(postArr, i, rightPostArr, 0, rightPostArr.length - 1);

            node.left = createByInAndPost(leftInArr, leftPostArr);
            node.right = createByInAndPost(rightInArr, rightPostArr);

            return node;
        }
        else
            return null;
    }
相關文章
相關標籤/搜索