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("");
    }
    
  • 相关阅读:
    Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
    ubuntu 关闭显示器的命令
    ubuntu android studio kvm
    ubuntu 14.04版本更改文件夹背景色为草绿色
    ubuntu 创建桌面快捷方式
    Ubuntu 如何更改用户密码
    ubuntu 14.04 返回到经典桌面方法
    ubuntu 信使(iptux) 创建桌面快捷方式
    Eclipse failed to get the required ADT version number from the sdk
    Eclipse '<>' operator is not allowed for source level below 1.7
  • 原文地址:https://www.cnblogs.com/fyusac/p/13205269.html
Copyright © 2011-2022 走看看