1. 程式人生 > >已知二叉樹的前序遍歷、中序遍歷或者中序遍歷、後序遍歷求二叉樹結構的演算法

已知二叉樹的前序遍歷、中序遍歷或者中序遍歷、後序遍歷求二叉樹結構的演算法

二叉樹中的前序遍歷是先訪問根結點,再訪問左子樹,右子樹。

中序遍歷是先訪問左子樹,再是根結點,最後是右子樹。

後序遍歷是先訪問左子樹,再是右子樹,最後是根結點。

演算法思路是先根據前序遍歷的第一個結點或者後序遍歷的最後一個結點,查詢對應在中序遍歷中的位置,就可以確定左子樹包含的元素和右子樹包含的元素,最後通過遞迴來實現就可以了。

二叉樹的表示形式為

//二叉樹的結構表示為
class TreeNode
{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {val = x;}
}

已知前序遍歷,中序遍歷求二叉樹結構,程式碼如下:
class Solution
{
    private TreeNode __buildTree(int[] preorder, int start1, int[] inorder, int start2, int len)
    {
        if (0 == len) return null;

        TreeNode root = new TreeNode(preorder[start1]);

        //在中序遍歷中找到根結點,確定左子樹和右子樹
        int index = start2;
        for (int i = start2; i < start2 + len; i++)
        {
            if (inorder[i] == preorder[start1])
            {
                index = i;
                break;
            }
        }

        int len1 = index - start2;
        root.left = __buildTree(preorder, start1 + 1, inorder, start2, len1);
        root.right = __buildTree(preorder, start1 + 1 + len1, inorder, index + 1, len - 1 - len1);

        return root;
    }

    public TreeNode buildTree(int[] preorder, int[] inorder)
    {
        return __buildTree(preorder, 0, inorder, 0, preorder.length);
    }
}

已知中序遍歷,後序遍歷,求二叉樹結構程式碼如下:
class Solution
{
    private TreeNode __buildTree(int[] inorder, int start1, int[] postorder, int start2, int len)
    {
        if (0 == len) return null;

        int val = postorder[start2 + len - 1];
        TreeNode root = new TreeNode(val);

        //在中序遍歷中找到根結點,確定左子樹和右子樹
        int index = start1;
        for (int i = start1; i < start1 + len; i++)
        {
            if (inorder[i] == val)
            {
                index = i;
                break;
            }
        }

        int len1 = index - start1;
        root.left = __buildTree(inorder, start1, postorder, start2, len1);
        root.right = __buildTree(inorder, start1 + 1 + len1, postorder, start2 + len1, len - 1 - len1);

        return root;
    }

    public TreeNode buildTree(int[] inorder, int[] postorder)
    {
        return __buildTree(inorder, 0, postorder, 0, postorder.length);
    }
}