前序與中序遍歷序列構造二叉樹 中序與后序遍歷序列構造二叉樹


105. 從前序與中序遍歷序列構造二叉樹

根據前序遍歷和中序遍歷,我們可以發現前序遍歷的第一個元素就為根元素,在中序遍歷中找到這個元素,那么中序遍歷中左邊為根元素的左子樹,右邊為右子樹,依次遞歸。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int len1 = preorder.length-1;
        int len2 = inorder.length-1;
        TreeNode root = bulidTree(preorder,0,len1,inorder,0,len2);
        return root;
    }
    public TreeNode bulidTree(int[] preorder, int start1,int end1,int[] inorder,int start2, int end2){
        if(start1>end1 || start2>end2){
            return null;
        }
        TreeNode node = new TreeNode(preorder[start1]);
        for(int k = start2; k<=end2; k++){
            if(preorder[start1] == inorder[k]){
                node.left = bulidTree(preorder,start1+1,start1+k-start2,inorder,start2,k-1);
                node.right = bulidTree(preorder,start1+k-start2+1,end1,inorder,k+1,end2);
            }
        }
        return node;
    }
}

106. 從中序與后序遍歷序列構造二叉樹

類似上一題的思路。后序遍歷的最后一個節點即為根節點,在中序遍歷中找到,然后中序遍歷左邊為根節點左子樹,右邊為根節點右子樹。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int len1 = inorder.length-1;
        int len2 = postorder.length-1;
        return bulid(inorder,0,len1,postorder,0,len2);
    }
    public TreeNode bulid(int[] p1,int start1, int end1,int[] p2,int start2, int end2){
        if(start1>end1||start2>end2) return null;
        int mid=0;
        for(int i=start1;i<=end1;i++){
            if(p1[i]==p2[end2]){
                mid = i;
                break;
            }
        }
        TreeNode node = new TreeNode(p2[end2]);
        node.left = bulid(p1,start1,mid-1,p2,start2,mid-start1+start2-1);
        node.right = bulid(p1,mid+1,end1,p2,end2-end1+mid,end2-1);
        return node;
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM