目录
94.二叉树中序遍历/easy
已经忘完了,前中后序遍历指的是根节点的顺序
public void Traverse(TreeNode root) {
if (root != null) {
//System.out.print(root.val+" ");
Traverse(root.left);
//System.out.print(root.val+" ");
Traverse(root.right);
//System.out.print(root.val+" ");
}
}
这只是最基本的递归思路模版,下面附上自己代码:
class Solution {
private ArrayList<Integer> res = new ArrayList<Integer>();
public List<Integer> inorderTraversal(TreeNode root) {
Traverse(root);
return res;
}
private void Traverse(TreeNode root){
if(root != null){
Traverse(root.left);
res.add(root.val);
Traverse(root.right);
}
}
}
在这里有个问题,ArrayList是定义的包装类,而add的是int类型,得益于Java的自动装箱(大佬勿喷)。 空间时间都是O(n)。
埋坑:迭代方法和Morris 中序遍历
105.从前序和中序序列构造二叉树Medium
根据前序和中序或者后序和中序才能复原二叉树,要恢复二叉树必须知道中序序列,只是知道前序和后序,不能恢复二叉树,因为不知道中序序列无法获知根节点的左右子树位置。
还是看题解完成的,结果输出树的根节点,应该就是这个树的层序遍历,root是根节点,一开始还没特别明白,好像也不是层序遍历。题目的要求是构造二叉树返回根节点。
class Solution {
private Map<Integer, Integer> indexMap;
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n = preorder.length;
//hash映射
indexMap = new HashMap<Integer,Integer>();
for(int i = 0; i < n; i++){
indexMap.put(inorder[i],i);
}
return getroot(preorder, 0, n-1, inorder, 0, n-1);
}
//前序遍历的第一个元素在中序遍历中定位,左右部分再递归
private TreeNode getroot(int[] preorder, int pre_start, int pre_end,
int[] inorder, int in_start, int in_end){
if(pre_start > pre_end){
return null;
}
//得到前序第一个元素在中序中的下标
int in_index = indexMap.get(preorder[pre_start]);
//定义根节点
TreeNode root = new TreeNode(preorder[pre_start]);
//左子树长度
int left_Subtree_size = in_index - in_start;
//圈出两个序列中的左子树
root.left = getroot(preorder, pre_start+1, pre_start + left_Subtree_size,
inorder, in_start, in_index -1);
//圈出两个序列中的右子树
root.right = getroot(preorder, pre_start + left_Subtree_size + 1, pre_end,
inorder, in_index + 1, in_end );
return root;
}
}