NC+LC:实现二叉树遍历

二叉树的前、中、后序遍历

解法一:递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) { //递归实现前序遍历
        if(root == null) return list;
        list.add(root.val);
        list = preorderTraversal(root.left);
        list = preorderTraversal(root.right);
        return list;
    }
}

解法二:栈

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) { //使用栈实现前序遍历
        List<Integer> list =  new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode currNode = root;
        while(currNode != null || !stack.isEmpty()){
            while(currNode != null){ //遍历入栈左节点,入栈的顺序就是前序遍历的顺序
                list.add(currNode.val);
                stack.push(currNode);
                currNode = currNode.left;
            }
            if(!stack.isEmpty()){
                currNode = stack.pop();
                currNode = currNode.right; //出栈当前节点,遍历其右节点
            }
        }
        return list;
    }
}

中序遍历

解法一:递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) { //递归实现中序遍历
        if(root == null) return list;
        list = inorderTraversal(root.left);
        list.add(root.val);
        list = inorderTraversal(root.right);
        return list;
    }
}

解法二:栈

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode currNode = root;
        while(currNode != null || !stack.isEmpty()){
            while(currNode != null){ //有左节点就循环入栈左节点
                stack.push(currNode);
                currNode = currNode.left;
            }
            if(!stack.isEmpty()){
                currNode = stack.pop();
                list.add(currNode.val); //出栈的顺序就是中序遍历的顺序
                currNode = currNode.right; //判断当前节点的右节点
            }
        }
        return list;
    }
}

后序遍历

解法一:递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) { //递归实现后序遍历
        if(root == null) return list;
        list = postorderTraversal(root.left);
        list = postorderTraversal(root.right);
        list.add(root.val);
        return list;
    }
}

解法二:栈

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) { //使用栈实现后序遍历
        List<Integer> list = new ArrayList<>();
        if(root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode currNode = root;
        while(currNode != null || !stack.isEmpty()){
            while(currNode != null){ //与前序遍历类似,但是是遍历入栈右节点,出栈遍历左节点
                list.add(currNode.val);
                stack.push(currNode);
                currNode = currNode.right;
            }
            if(!stack.isEmpty()){
                currNode = stack.pop().left;
            }
        }
        Collections.reverse(list); //最后再反转List集合
        return list;
    }
}

二叉树的层序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) { //使用队列实现层序遍历
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(root == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size(); //记录当前层级的节点数
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < size; i++){ //遍历当前层级的所有节点
                TreeNode currNode = queue.poll();
                list.add(currNode.val);
                if(currNode.left != null) queue.offer(currNode.left); //左右节点不为空就将其入队
                if(currNode.right != null) queue.offer(currNode.right);
            }
            res.add(list);
        }
        return res;
    }
}

二叉树的之字形层序遍历

NC14 按之字形顺序打印二叉树

思路

  • 第一层从左向右,下一层从右向左,一直这样交替
  • 思路基本与二叉树的层序遍历一样,刚开始想过利用栈或者根据不同层级决定入队的顺序,但都无法得到正确的结果
  • 既然无法通过改变出入队来实现交替遍历,那就从将它加入ArrayList时入手
  • 按照正常的出队,将元素加入到当前层级的ArrayList中,在偶数层时进行头插入,这样后一个元素就在前一个的前面了,奇数层时进行尾插入

实现代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        int level = 1;//层级
        while(!queue.isEmpty()){
            ArrayList<Integer> arrList = new ArrayList<Integer>();
            int size = queue.size(); //当前层级的元素数
            for(int i = 0; i<size; i++){//将该层元素遍历出队
                TreeNode node = queue.poll();
                if(level % 2 == 0){//偶数层进行头插入
                    arrList.add(0, node.val);
                }else{//奇数层进行尾插入
                    arrList.add(node.val);
                }
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            level++;
            res.add(arrList);
        }
        return res;
    }
}

二叉树的自底向上层序遍历

LC 107. 二叉树的层序遍历 II:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/

思路

遍历过程与正常层序遍历类似,只是将每一层的结果以头插入的方式放入结果集合中,ArrayList的add()方法正常是进行尾插入的,add(0, list)可实现头插入

实现代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> resList = new ArrayList<List<Integer>>();
        if(root == null){
            return resList;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size(); //当前层级的节点数
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < size; i++){ //遍历当前层级的所有节点
                TreeNode node = queue.poll();
                list.add(node.val);
                if(node.left != null){ //当前节点有左右节点就进行入队
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            resList.add(0, list); //头插入
        }
        return resList;
    }
}

全部评论

相关推荐

霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
邮小鼠:粤嵌的项目水的要死 来我们学校带过课程实习 项目名字是车机终端 实际上就是写了了个gui 还是老师把代码发给你你改改的那种
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务