本文共 1657 字,大约阅读时间需要 5 分钟。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { // 初始化字段:前序、中序、当前要处理的前序遍历首元素(每次处理完后该值加1,即处理下一个根结点) int[] preorder; int[] inorder; int preFront; // 根据中序生成的哈希表,方便确定左右子结点数量 MapinorderMap = new HashMap (); // 返回一个创建好二叉树的结点 的辅助递归函数:特殊情况、返回值 public TreeNode helper(int inLeft,int inRight){ if(inLeft > inRight){ return null; } // 获取前序遍历的首结点的值再生成新的根节点 int rootVal = preorder[preFront++]; TreeNode root = new TreeNode(rootVal); // 找到其在中序遍历中的位置下标 int rootIndex = inorderMap.get(rootVal); // 根据前序遍历特点,左子树排前面,优先处理。根据得到的下标确定子树的范围 root.left = helper(inLeft,rootIndex-1); root.right = helper(rootIndex+1,inRight); return root; } public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder = preorder; this.inorder = inorder; preFront = 0; // i 是辅助变量表示下标,给map添加元素用的;其中键时结点值,更方便get得到下标 int i = 0; for(int val:inorder){ inorderMap.put(val,i++); } return helper(0,inorder.length-1); }}
之前刷过的题目,还有许多细节要注意。
这题主要思路就是:关于递归还是需要注意这几点:
转载地址:http://lsozi.baihongyu.com/