`

Binary Tree的题目总结(二)

阅读更多
这篇文章列出了leetcode中有关二叉树遍历的题目,之前在二叉树的深搜和广搜中介绍过,这里再重复一下,因为这都是最基本的操作,需要我们熟练掌握。

1,Binary Tree Level Order Traversal
二叉树的广度优先搜索,输出所有节点的值,说的广搜,我们一律用队列来完成,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> llist = new ArrayList<List<Integer>>();
        List<Integer> list = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        int count = 0;
        int helper = 1;
        if(root == null) return llist;
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(helper > 0){
                list.add(node.val);
                helper --;
            }
            if(node.left != null) {
                queue.offer(node.left);
                count ++;
            }
            if(node.right != null) {
                queue.offer(node.right);
                count ++;
            }
            
            if(helper == 0) {
                llist.add(new ArrayList<Integer>(list));
                list.clear();
                helper = count;
                count = 0;
            }
        }
        return llist;
    }
}


2,Binary Tree Level Order Traversal II
给定二叉树:{3,9,20,#,#,15,7},
输出:[[15,7], [9,20], [3]]

这是第一题的变形,仅仅把结果逆序输出,我们用链表中的addFirst()方法就解决了。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        LinkedList<List<Integer>> llist = new LinkedList<List<Integer>>();
        List<Integer> list = new ArrayList<Integer>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root == null) return llist;
        queue.offer(root);
        int count = 0;
        int helper = 1;
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(helper > 0) {
                list.add(node.val);
                helper --;
            }
            if(node.left != null) {
                queue.offer(node.left);
                count ++;
            }
            if(node.right != null) {
                queue.offer(node.right);
                count ++;
            }
            
            if(helper == 0) {
                llist.addFirst(new ArrayList<Integer>(list));
                list.clear();
                helper = count;
                count = 0;
            }
        }
        return llist;
    }
}


下面是二叉树的前序遍历,中序遍历,后序遍历,都属于深搜,我们用堆栈来完成。

3,Binary Tree Inorder Traversal
二叉树的中序遍历,输出所有节点的值。

代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        if(root == null) return list;
        while(root != null || !stack.isEmpty()) {
            if(root != null) {
                stack.push(root);
                root = root.left;
            } else {
                TreeNode node = stack.pop();
                list.add(node.val);
                root = node.right;
            }
        }
        return list;
    }
}


4,Binary Tree Preorder Traversal
二叉树的前序遍历,输出所有节点的值。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        if(root == null) return list;
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode tem = stack.pop();
            list.add(tem.val);
            if(tem.right != null) {
                stack.push(tem.right);
            }
            if(tem.left != null) {
                stack.push(tem.left);
            }
        }
        return list;
    }
}


5,Binary Tree Postorder Traversal
二叉树的后序遍历,输出所有节点的值。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList<Integer> list = new LinkedList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        if(root == null) return list;
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
            list.addFirst(node.val);
            if(node.left != null) {
                stack.push(node.left);
            }
            if(node.right != null) {
                stack.push(node.right);
            }
        }
        return list;
    }
}
分享到:
评论

相关推荐

    binarytree.rar

    二叉树是一种在计算机科学中广泛使用的数据结构,它的每个节点最多有两个子节点,通常称为左子节点和右...解压“binarytree.rar”,查看其中的文件,理解数据结构,并根据给定的描述编写代码,以实现二叉树的前序遍历。

    leetcode的题目:Balanced Binary Tree

    在LeetCode的"Balanced Binary Tree"题目中,通常要求判断给定的二叉树是否是平衡的。这个问题可以通过递归或迭代的方式来解决。递归方法是分别检查左子树和右子树是否平衡,以及它们的高度。迭代方法则可以使用层次...

    recover-the-binary-tree.zip_The Tree

    题目中的"recover-the-binary-tree.zip_The Tree"文件包含了一个名为"recover the binary tree.cpp"的源代码文件,这很可能是实现这个恢复过程的C++程序。为了理解并执行这个过程,我们需要了解以下步骤: 1. **...

    MengZhaoFly#sword-byteDance-fe#二叉树的所有路径(binary-tree-paths)1

    题目二叉树所有路径题解* Definition for a binary tree node.* function TreeNode(val) {* @para

    LeetCode和剑指offer中的算法题的题目和解法 和 常见算法汇总

    1.2 Binary Search(二分查找) 1.3 Is Prime(是否是质数) 1.4 Is Ugly Number(是否是丑数) 1.5 Is Power Of Two(是否是2的幂) 1.6 Is Power Of Three(是否是3的幂) 1.7 Count Primes(质数的个数) 2...

    leetcode伪代码-mergo-two-binary-tree:合并二叉树

    leetcode伪代码merge-two-binary-tree 题目解读: 题目来源: 原文: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the...

    minimum-depth-of-binary-tree.rar_leetcode

    在提供的"minimum depth of binary tree"代码中,可能包含了上述的一种或多种解冑策略。解冑代码应该能够处理各种类型的二叉树,包括平衡树和高度不均衡的树,同时具有良好的时间复杂度和空间复杂度。具体实现细节和...

    前端大厂最新面试题-binary-indexed-tree.docx

    **二叉索引树(Binary Indexed Tree,BIT)**,又称 Fenwick 树,是数据结构中的一个重要概念,尤其在前端工程师的面试中常被问到。它是一种高效的数据结构,用于快速处理数组中区间的求和问题以及部分更新操作。在...

    Leetcode题目+解析+思路+答案.pdf

    - **Convert Sorted List/Array to Binary Search Tree**:将有序列表或数组转换为二叉搜索树。 - **Path Sum II**:寻找所有从根节点到叶节点的路径,其路径和等于给定的目标值。 - **Flatten Binary Tree to ...

    leetcode110-BinaryTree_HeightBalanced:力扣110

    至于提供的压缩包文件`BinaryTree_HeightBalanced-master`,它很可能包含了该问题的解决方案源代码,可能是用Python或其他编程语言实现的。解压后,你将能够看到具体的实现细节,包括如何创建二叉树节点、如何进行...

    2018年最新Google Onsite面经总结1

    从标题和描述中可以看到,本文主要关注于LeetCode原题的总结,涵盖了162个题目,包括Find Peak Element、Isomorphic Strings、Group Shifted Strings等,这些题目都是Google Onsite面经中的常见题目。 下面将对这些...

    [数据结构与算法]JAVA二叉树题目总结(包含常见题目部分LeetCode题解)

    在IT领域,数据结构与算法是编程基础的重要组成部分,...总结,Java中的二叉树题目不仅要求对数据结构有深入理解,还需要灵活运用算法。不断练习和分析这些题目,能够帮助你提高编程技巧,增强在实际工作中的竞争力。

    leetcode卡-leetcode_practices_learncard_binarytree:我的leetcode练习二叉树学习卡

    本资源“leetcode_practices_learncard_binarytree”是一份全面的二叉树学习卡片,作者通过Java8语言完成了所有相关题目,旨在帮助学习者深入理解二叉树及其相关算法。 一、二叉树基础 二叉树是一种非线性数据结构...

    浙江大学2018-19秋冬《数据结构基础》期末模拟练习21

    3. **二分查找** - 如果N个数字按递增顺序存储在单链表中,二分查找的平均时间复杂度不是O(logN),而是线性的O(N),因为链表中没有随机访问。 4. **大O符号** - 表示渐进行为的符号,(logN)^2 是 O(N) 的子集,意味...

    二叉树的直径(diameter-of-binary-tree)

    代码一的解决方案首先定义了一个`diameterOfBinaryTree`函数,它递归地计算每个子节点的最大深度,并返回当前节点的最大深度。在这个过程中,通过`depth`函数计算节点的深度,同时更新全局变量`max`,存储当前找到的...

    算法文档无代码一些与树有关的题目

    - 二叉搜索树(Binary Search Tree, BST):一种特殊的二叉树,其中每个节点的左子树只包含小于当前节点的数,每个节点的右子树只包含大于当前节点的数。 - 红黑树(Red-Black Tree):一种自平衡的二叉搜索树,每条...

    leetcode题目分类

    从文档中可以看出,这些题目覆盖了各种类型的数据结构和算法,如数组(array)、链表(linked list)、字符串(string)、哈希表(hashtable)、栈(stack)、队列(queue)、二叉树(binary tree)、图(graph)、...

    leetcode卡-leetcode_binary_tree:https://leetcode.com/explore/learn/card/

    这个标签可能意味着LeetCode的二叉树专题卡片内容是开源的,也就是说,可能有一个开源项目或者代码库(如“leetcode_binary_tree-master”)包含了这些题目的解决方案或者其他学习资源。开源意味着社区可以贡献、...

Global site tag (gtag.js) - Google Analytics