ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
根据前序遍历和中序遍历树构造二叉树. 你可以假设树中不存在相同数值的节点 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: ``` 2 / \ 1 3 ``` **规则** 输入:两个数组 int a[] 和 int b[] 输出:头结点Head case: ``` 数组为null或length为0 两个数组长度不一致,内容不同 只有一个元素 只有两个元素 都在左侧 都在右侧 两边都有 ``` **思路** 对一个实例`{1,2,4,7,3,5,6,8},{4,7,2,1,5,3,8,6}`进行分析后,可以得出这样的规则 ``` a[0]为头节点,在b中找到该节点位置3,那么a从1开始,共3个元素为左边子树,4-end为右边子树 设每次数组有范围ae~ab be-bb bi为a[ae]也就是节点在b数组中的index 左 ab = ab+1 ae =ab+1+size bb = bb be = bi - 1 size = bi-1-bb 右 ab = ab+1+size+1 ae=ae bb=bi+1 be=be 其中,ae不能大于ab be不能大于bb 否则返回null ``` **代码** ``` public class Solution { /** *@param preorder : A list of integers that preorder traversal of a tree *@param inorder : A list of integers that inorder traversal of a tree *@return : Root of a tree */ public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder == null || inorder == null) {return null;} if(preorder.length * inorder.length == 0) {return null;} if(preorder.length != inorder.length) {return null;} return buildTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1); } private TreeNode buildTree (int[] a,int ab,int ae, int[] b,int bb,int be) { if(ab > ae || bb > be) { return null; } TreeNode node = new TreeNode(a[ab]); int bi = -1; for(int i = bb ;i <= be ; i++) { if(b[i] == a[ab]) { bi = i; break; } } if(bi == -1) { throw new NullPointerException("cannot find "+a[ab]); } node.left = buildTree(a,ab+1,(ab+1)+(bi-1-bb),b,bb,bi-1); node.right = buildTree(a,(ab+1)+(bi-1-bb)+1,ae,b,bi+1,be); return node; } } ``` **测试代码** ``` public class TreeNode { public int val; public TreeNode left, right; public TreeNode(int val) { this.val = val; this.left = this.right = null; } public static String print(TreeNode node) { Deque<TreeNode> queue = new LinkedList<TreeNode>(); if(node == null) { return "-1,"; } queue.addLast(node); StringBuilder sb = new StringBuilder(); while(!queue.isEmpty()) { TreeNode thisNode = queue.removeFirst(); if(thisNode == null) { sb.append("-1,"); }else { sb.append(thisNode.val+","); queue.addLast(thisNode.left); queue.addLast(thisNode.right ); } } return sb.toString(); } public static TreeNode build(String tree) { String arr [] = tree.split(","); TreeNode allNode [] = new TreeNode[arr.length]; for(int i = 0; i < arr.length; i++) { int val = Integer.parseInt(arr[i]); if(val == -1) { allNode[i] = null; }else { allNode[i] = new TreeNode(val); } } for(int i = 0; i < arr.length; i++) { TreeNode node = allNode[i]; int li = i*2 + 1; int ri = i*2 + 2; if(node != null) { node.left = (li > allNode.length-1) ? null : allNode[li]; node.right = (ri > allNode.length-1)? null : allNode[ri]; } } return allNode[0]; } public static void main(String[] args) { TreeNode head = build("1,2,3,-1,4"); System.out.println(TreeNode.print(head)); } } ``` ``` public void test1() { int t1 [][]= new int[][]{{2,1,3},{1,2,3}}; RebuildTree1 builder = new RebuildTree1(); TreeNode head = builder.buildTree(t1[0], t1[1]); assertResult(head,"2,1,3"); int t2 [][]= new int[][]{{1,2,4,7,3,5,6,8},{4,7,2,1,5,3,8,6}}; head = builder.buildTree(t2[0], t2[1]); assertResult(head,"1,2,3,4,-1,5,6,-1,7,-1,-1,8,-1"); } private void assertResult(TreeNode head,String rs) { System.out.println(TreeNode.print(head)); assertTrue(TreeNode.print(head).indexOf(rs) == 0); } ```