剑指offer7 重建二叉树

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode head = forReconstruct(pre,in,0,pre.length-1,0,in.length-1);
        return head;
    }
    private TreeNode forReconstruct(int [] pre,int [] in,int pre_start,int pre_end,int in_start,int in_end) {
        TreeNode node = new TreeNode(pre[pre_start]);
        //find val in array_in
        int index = in_start;
        for(;index<=in_end;index++){
            if(in[index]==pre[pre_start]) break;
        }
        if(index>in_start) node.left=forReconstruct(pre,in,pre_start+1,pre_start+1+index-in_start-1,in_start,index-1);
        if(index<in_end) node.right=forReconstruct(pre,in,pre_start+1+index-in_start,pre_end,index+1,in_end);
        return node;
    }
}

 

 

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if pre is None or tin is None or len(pre)<1 or len(tin)<1 or len(pre)!=len(tin):
            return None
        return self._constructAndGetRoot(pre,tin,0,len(pre)-1,0,len(tin)-1)
    
    def _constructAndGetRoot(self,pre,tin,pre_start,pre_end,tin_start,tin_end):
        # 如果只有一个元素,直接返回;如果没有元素,返回None
        if pre_start==pre_end:
            return TreeNode(pre[pre_start])
        if pre_start>pre_end:
            return None
        # 在tin里找到pre的头元素pre[pre_start]
        tin_index = -1
        for i in range(tin_start,tin_end+1):
            if tin[i]==pre[pre_start]:
                tin_index = i
                break
        left_length = tin_index-tin_start
        thisNode = ListNode(pre[pre_start])
        thisNode.left = self._constructAndGetRoot(pre,tin,pre_start+1,pre_start+left_length,tin_start,tin_index-1)
        thisNode.right= self._constructAndGetRoot(pre,tin,pre_start+left_length+1,pre_end,tin_index+1,tin_end)
        return thisNode
        
        

运行时间:45ms

占用内存:5732k

posted @ 2019-02-13 14:41  大胖子球花  阅读(73)  评论(0)    收藏  举报