剑指 Offer 07. 重建二叉树
递归问题的分析
特点:大问题可以划分为形式相同的小问题;
步骤:明确递归函数要解决的问题/要得到的结果(首先不要考虑问题解决的细节,知道问题是什么很重要);
终止递归的条件;
分析问题隐含的等式关系。
根据前序遍历和中序遍历重建二叉树。
根据前序遍历找到树的根节点--在中序遍历找到这个根节点,根据中序遍历可以知道左右子树的节点个数--在前序遍历中找到左子树的根节点,右子树的根节点;
重复这一过程可以重建二叉树。在中序遍历根据根节点的位置,树的左边界的位置,树的右边界的位置可以得到子树的节点个数。
退出条件是:左边界大于右边界。(等于是什么情况:应该是叶节点吧)
本题还要道了HashMap的使用
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 HashMap<Integer,Integer> hash = new HashMap<>();//不写类型会默认是object型吗 12 int[] preorder; 13 public TreeNode buildTree(int[] preorder, int[] inorder) { 14 for(int i=0;i<inorder.length;i++) 15 hash.put(inorder[i],i); 16 17 this.preorder=preorder;//数组的copy是这样吗? 18 19 return rebuildTree(0,0,inorder.length-1); 20 } 21 22 TreeNode rebuildTree(int indexOfRoot_pre,int indexOfLeft_in,int indexOfRight_in){ 23 if(indexOfLeft_in>indexOfRight_in)//等于呢 24 return null; 25 TreeNode root =new TreeNode(preorder[indexOfRoot_pre]);//创建根节点 26 int in_root=hash.get(preorder[indexOfRoot_pre]);//找到根节点在中序中的秩 27 28 29 root.left= rebuildTree(indexOfRoot_pre+1,indexOfLeft_in,in_root-1); 30 root.right=rebuildTree(indexOfRoot_pre+1+in_root-indexOfLeft_in,in_root+1,indexOfRight_in); 31 32 return root; 33 34 } 35 }

浙公网安备 33010602011771号