题目;
Given inorder and postorder traversal of a tree, construct the binary tree.
题意及分析:给出棵二叉树的中序遍历和后续遍历,求这棵树。同用先序和中序推二叉树,不同的点是,后序遍历的最后一个点才是根节点。
代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { if(inorder.length==0) return null; TreeNode root = new TreeNode(postorder[postorder.length-1]); //后序遍历最后一个节点为根节点 build(root,inorder,postorder); return root; } public void build(TreeNode root,int[] inorder, int[] postorder){ int nodeVal = root.val; int index = 0; for(int i=0;i<inorder.length;i++){ if(inorder[i]==nodeVal){ //找到中序遍历分割左右子树的点 index = i; break; } } int[] leftInorder=Arrays.copyOfRange(inorder,0,index); //左子树中序遍历 int[] leftPostorder=Arrays.copyOfRange(postorder,0,index); //左子树后序遍历 if(leftPostorder.length!=0){ //后序遍历的最后一个值为当前点的左节点 root.left = new TreeNode(leftPostorder[leftPostorder.length-1]); build(root.left,leftInorder,leftPostorder); } int[] rightInorder=Arrays.copyOfRange(inorder,index+1,inorder.length); int[] rightPostorder=Arrays.copyOfRange(postorder,index,postorder.length-1); if(rightInorder.length!=0){ root.right = new TreeNode(rightPostorder[rightPostorder.length-1]); build(root.right,rightInorder,rightPostorder); } } }