leetcode hot100_day01

目录

94.二叉树中序遍历/easy

105.从前序和中序序列构造二叉树Medium


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;

    }
}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值