LeetCode 打卡day14 -- 树的前中后序遍历

本文介绍了在LeetCode上的二叉树遍历问题,包括前序、中序和后序遍历的递归和迭代解法,并详细解释了代码实现过程。
摘要由CSDN通过智能技术生成


知识总结

今天的是二叉树的第一天,学习了解树的基本概念和树的前中后序 遍历

满二叉树
满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
请添加图片描述
完全二叉树
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。

请添加图片描述
二叉搜索树

有顺序的二叉树, 满足左子树 < 父节点 < 右子树请添加图片描述

平衡二叉搜索树
在二叉搜索树的基础上, 满足任意一个节点左右两个子树的高度差的绝对值不大于一。
请添加图片描述
树的遍历

下面这个图非常形象, 前中后序都是针对中间节点的遍历顺序。
请添加图片描述

图片参考代码随想录

今天所有的题目都运用了两种方法, 一个是递归法, 比较容易理解, 利用一个自定义的函数进行深度遍历。

另外一个是迭代法, 使用一个Stack来取代递归法, 在每个要处理的节点前加入null。注意出栈顺序要和入栈顺序正好相反


Leetcode 144. 二叉树的前序遍历

题目链接

题目说明

给你二叉树的根节点 root ,返回它节点值的 前序 遍历

代码说明

递归法

/**
 * 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> res = new ArrayList<>();
        preOrder(res, root);
        return res;
    }

    public void preOrder(List<Integer> res, TreeNode root){
        if(root == null) return;
        res.add(root.val);
        preOrder(res, root.left);
        preOrder(res, root.right);
    }
}

迭代统一法
入栈顺序: 右 -> 左 -> 中 -> null
出栈顺序: 中 -> 左 -> 右

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    List<Integer> res = new ArrayList<>();
    if(root == null) return res;
    stack.push(root);
    while(!stack.isEmpty()){
        TreeNode cur = stack.peek();
        if(cur != null){
            stack.pop();
            if(cur.right != null) stack.push(cur.right);
            if(cur.left != null) stack.push(cur.left);
            stack.push(cur);
            stack.push(null);
        }else{
            stack.pop();
            res.add(stack.pop().val);
        }
    }
    return res;
    }
}

Leetcode 94. 二叉树的中序遍历

题目链接

题目说明

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

代码说明

递归法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        inOrder(list, root);
        return list;
    }

    public void inOrder(List<Integer> list, TreeNode root){
        if(root == null){
            return;
        }
        inOrder(list, root.left);
        list.add(root.val);
        inOrder(list, root.right);
    }
}

迭代统一法

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.peek();
            if(cur != null){
                stack.pop();
                if(cur.right != null) stack.push(cur.right);
                stack.push(cur);
                stack.push(null);
                if(cur.left != null) stack.push(cur.left);
            }else{
                stack.pop();
                res.add(stack.peek().val);
                stack.pop();
            }
        }
        return res;
    }
}

Leetcode 145. 二叉树的后序遍历

题目链接

题目说明

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

代码说明

递归法

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        postOrder(res, root);
        return res;
    }

    public void postOrder(List<Integer> res, TreeNode root){
        if(root == null) return;
        postOrder(res, root.left);
        postOrder(res, root.right);
        res.add(root.val);
    }
}

迭代法

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {

        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        stack.push(root);

        while(!stack.isEmpty()){
            TreeNode cur = stack.peek();
            if(cur != null){
                stack.push(null);
                if(cur.right != null) stack.push(cur.right);
                if(cur.left != null) stack.push(cur.left);
            }else{
                stack.pop();
                res.add(stack.pop().val);
            }
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值