zoukankan      html  css  js  c++  java
  • 剑指 Offer 07. 重建二叉树

    import java.util.LinkedList;
    
    /**
     * @Class BuildTree
     * @Description 剑指 Offer 07. 重建二叉树
     * 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
     * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
     * <p>
     * 例如,给出
     * 前序遍历 preorder = [3,9,[10,11],20,15,7]
     * 中序遍历 inorder = [10,9,11,3,15,20,7]
     * 返回如下的二叉树:
     * 3
     * /   
     * 9    20
     * /    /  
     * 10 11 15 7
     * <p>
     * 限制:
     * 0 <= 节点个数 <= 5000
     * @Author
     * @Date 2020/6/28
     **/
    public class BuildTree {
        static class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
            TreeNode(int x) {
                val = x;
            }
        }
    }
    
    // 利用递归
    public static TreeNode buildTree(int[] preorder, int[] inorder) {
    	if (preorder == null || inorder == null) {
    		return null;
    	}
    	if (preorder.length == 1 && inorder.length == 1) {
    		return new TreeNode(preorder[0]);
    	}
    	TreeNode treeNode = buildTree(preorder, 0, inorder, 0, inorder.length - 1);
    	return treeNode;
    }
    
    private static TreeNode buildTree(int[] preorder, int rootIndex, int[] inorder, int start, int end) {
    	// 终止条件
    	if (preorder == null || inorder == null ||
    			start > end || start >= inorder.length) {
    		return null;
    	}
    	int index = start;
    	for (; index <= end; index++) {
    		if (inorder[index] == preorder[rootIndex]) break;
    	}
    	TreeNode treeNode = new TreeNode(preorder[rootIndex]);
    	// rootIndex++ 会导致递归内存溢出,x++与++x的区别
    	// 左子树的范围是inorder[start,index-1];,左子节点是preorder[++rootIndex]
    	// 右子树的范围是inorder[index+1,end];右子节点是preorder[rootIndex + index - start]
    	treeNode.left = buildTree(preorder, ++rootIndex, inorder, start, index - 1);
    	treeNode.right = buildTree(preorder, rootIndex + index - start, inorder, index + 1, end);
    	return treeNode;
    }
    
    /**
     * 解法2:利用递归
     */
    public static int[] reversePrint(ListNode head) {
    	LinkedList<Integer> linkedList = new LinkedList<>();
    	reversePrint(head,linkedList);
    	int size = linkedList.size();
    	int[] ans = new int[size];
    	for (int i = 0; i < size; i++) {
    		ans[i]= linkedList.pop();
    	}
    	return ans;
    }
    
    private static LinkedList<Integer> reversePrint(ListNode listNode, LinkedList linkedList){
    	if(listNode==null) return null;
    	linkedList.add(listNode.val);
    	return reversePrint(listNode.next,linkedList);
    }
    
    // 测试用例
    public static void print(TreeNode treeNode, LinkedList linkedList) {
    	if (treeNode == null) return;
    	print(treeNode.left, linkedList);
    	print(treeNode.right, linkedList);
    	linkedList.add(treeNode.val);
    }
    public static void main(String[] args) {
    	int[] preorder = new int[]{3, 9, 20, 15, 7};
    	int[] inorder = new int[]{9, 3, 15, 20, 7};
    	TreeNode treeNode = buildTree(preorder, inorder);
    	LinkedList linkedList = new LinkedList();
    	print(treeNode, linkedList);
    	System.out.println("demo01 result:");
    	for (int i = 0; i < linkedList.size(); i++) {
    		System.out.print(" " + linkedList.get(i));
    	}
    	System.out.println("");
    
    	preorder = new int[]{1,2,3};
    	inorder = new int[]{3,2,1};
    	treeNode = buildTree(preorder, inorder);
    	linkedList = new LinkedList();
    	print(treeNode, linkedList);
    	System.out.println("demo02 result:");
    	for (int i = 0; i < linkedList.size(); i++) {
    		System.out.print(" " + linkedList.get(i));
    	}
    	System.out.println("");
    }
    
  • 相关阅读:
    数据库三范式(转)
    Tyrion中文文档(含示例源码)
    mongodb数据库导入导出恢复
    HTTP协议:Content-Type
    requests爬虫组件
    JS 数组对象
    JS 函数
    javascript window对象属性和方法
    js String对象
    Math对象-JavaScript
  • 原文地址:https://www.cnblogs.com/fyusac/p/13205269.html
Copyright © 2011-2022 走看看