剑指 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 }

 

posted @ 2021-03-09 21:16  wsshub  阅读(67)  评论(0)    收藏  举报