二叉树的遍历

开篇: 本篇文章主要记录二叉树的前、中、后、层次遍历以及相关变形题解。

第一题:二叉树的前序遍历

方法一:递归
public List<Integer> preOrder(TreeNode root){
        List<Integer> list=new ArrayList<>();
        preOrder(root,list);
        return list;
    }

    private void preOrder(TreeNode root, List<Integer> list) {
        if(root==null)
            return ;
        if(root!=null){
            list.add(root.val);
            if(root.left!=null)
                preOrder(root.left,list);
            if(root.right!=null)
                preOrder(root.right,list);
        }
    }
方法二:迭代
public List<Integer> preOrder2(TreeNode root){
        LinkedList<Integer> list=new LinkedList<>();
        if(root==null)
            return list;
        LinkedList<TreeNode> arr=new LinkedList<>();
        arr.add(root);
        while(!arr.isEmpty()){
            TreeNode cur=arr.pollLast();
            list.add(cur.val);
            if(cur.right!=null)
                arr.add(cur.right);
            if(cur.left!=null)
                arr.add(cur.left);
        }
        return list;
    }

第二题:二叉树的中序遍历

方法一:递归
public List<Integer> inOrder(TreeNode root){
        List<Integer> list=new ArrayList<>();
        inOrder(root,list);
        return list;
    }

    private void inOrder(TreeNode root, List<Integer> list) {
        if(root==null)
            return ;
        if(root!=null){
            if(root.left!=null)
                inOrder(root.left,list);
            list.add(root.val);
            if(root.right!=null)
                inOrder(root.right,list);
        }
    }
方法二:迭代
public List<Integer> inOrder2(TreeNode root){
        List<Integer> list=new ArrayList<>();
        if(root==null)
            return list;
        Stack<TreeNode> arr=new Stack<>();

        TreeNode node=root;
        while (!arr.isEmpty()||node!=null){
            while(node!=null){
                arr.add(node);
                node=node.left;
            }
            node=arr.pop();
            if(node==null)
                continue;
            list.add(node.val);
            node=node.right;
        }
        return list;
    }

第三题:二叉树的后序遍历

方法一:递归
public List<Integer> postOrder(TreeNode node){
        List<Integer> list=new ArrayList<>();
        postOrder(node,list);
        return list;
    }

    private void postOrder(TreeNode node, List<Integer> list) {
        if(node==null)
            return ;
        if(node!=null){
            if(node.left!=null)
                postOrder(node.left,list);
            if(node.right!=null)
                postOrder(node.right,list);
            list.add(node.val);
        }
    }
方法二:迭代
public List<Integer> postOrder2(TreeNode root){
        LinkedList<Integer> list=new LinkedList<>();
        LinkedList<TreeNode> cur=new LinkedList<>();
        if(root==null)
            return list;
        cur.add(root);
        while (!cur.isEmpty()){
            TreeNode node=cur.pollLast();
            list.addFirst(node.val);
            if(node.left!=null)
                cur.add(node.left);
            if(node.right!=null)
                cur.add(node.right);
        }
        return list;
    }

第四题:二叉树的层次遍历

解法:BFS
public List<List<Integer>> levelOrder(TreeNode root){
        List<List<Integer>> list=new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);

        while(!queue.isEmpty()){
            int size=queue.size();
            List<Integer> level=new LinkedList<>();
            for(int i=0;i<size;i++){
                TreeNode node=queue.peek();
                queue.poll();
                if(node==null)
                    continue;
                level.add(node.val);
                queue.add(node.left);
                queue.add(node.right);
            }
            if(level.size()!=0)
                list.add(level);
        }
        return list;

    }

第五题:二叉树的锯齿形层次遍历

public List<List<Integer>> levelorder2(TreeNode root){
        List<List<Integer>> list=new ArrayList<>();
        if(root==null)
            return list;
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        int count=0;

        while(!queue.isEmpty()){
            int size=queue.size();
            List<Integer> level=new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node=queue.peek();
                queue.poll();
                if(node==null)
                    continue;
                if(count%2==0){
                    level.add(node.val);
                }else{
                    level.add(0,node.val);
                }
                queue.offer(node.left);
                queue.offer(node.right);
            }
            count++;
            if(level.size()!=0)
                list.add(level);
        }
        return list;

    }

第六题:从前序与中序遍历序列构造二叉树

public  TreeNode  buildTree(int[] pre,int[] in){
        if(pre==null ||in==null)
            return null;
        return buildTree(pre,0,pre.length-1,in,0,in.length-1);
    }

    private TreeNode buildTree(int[] pre, int prestart, int preend, int[] in, int instart, int inend) {
        if(prestart>preend ||instart>inend)
            return null;
        TreeNode node=new TreeNode(pre[prestart]);
        for(int i=instart;i<=inend;i++){
            if(pre[prestart]==in[i]){
                node.left=buildTree(pre,prestart+1,prestart+i-instart,in,instart,i-1);
                node.right=buildTree(pre,prestart+i-instart+1,preend,in,i+1,inend);
            }
        }
        return node;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值