`

Binary Tree的题目总结(一)

阅读更多
与数组和链表相比,树的题目比它们要难一些,我们往往通过递归来处理树的题目,下面是对leetcode有关树操作的几道题目,包括找出树的所有路径,计算完全二叉树节点个数,二叉搜索树的最近公共祖先,普通二叉树的最近公共祖先。

1,Binary Tree Paths
给定一个二叉树,输出所有根节点到叶子节点的路径。

用深度优先遍历(DFS),依次保留搜索过的节点。代码如下:
/**
 * 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<String> binaryTreePaths(TreeNode root) {
        List<String> list = new LinkedList<String>();
        if(root == null) return list;
        String str = String.valueOf(root.val);
        DFS(root, str, list);
        return list;
    }
    private void DFS(TreeNode root, String str, List<String> list) {
        if(root.left == null && root.right == null) 
            list.add(str);
        if(root.left != null) 
            DFS(root.left, str + "->" + root.left.val, list);
        if(root.right != null)
            DFS(root.right, str + "->" + root.right.val, list);
        
    }
}


2,Count Complete Tree Nodes
给定一个完全二叉树,计算树中节点的个数。

既然是完全二叉树,我们要好好利用它特有的性质,完全二叉树只有最后一层不满,并且节点是从左到右排列的。一个n层满二叉树的节点个数为2^n - 1,因此我们可以利用这些性质来处理这道题。代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        int leftnode = -1;
        int rightnode = -1;
        return countNodes(root, leftnode, rightnode);
    }
    
    private int countNodes(TreeNode root, int leftnode, int rightnode){
        if(leftnode == -1) {
            TreeNode cur = root;
            while(cur != null) {
                leftnode ++;
                cur = cur.left;
            }
        }
        
        if(rightnode == -1) {
            TreeNode cur = root;
            while(cur != null) {
                rightnode ++;
                cur = cur.right;
            }
        }
        
        if(leftnode == rightnode) return (1 << leftnode) - 1;
        return 1 + countNodes(root.left, leftnode -1, -1) + countNodes(root.right, -1, rightnode -1);
    }
}


3,Lowest Common Ancestor of a Binary Search Tree
给定一个二叉搜索树,查找两个节点的最近公共祖先。

不清楚公共祖先定义的查阅网上资料。二叉搜索树的性质是左子树的值都小于根节点值,右子树的值都大于根节点的值,我们可以通过值的比较来判断要查找的两个节点的位置,从而找到公共祖先。代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q) return root;
        if(p.val < root.val && q.val < root.val) return lowestCommonAncestor(root.left, p, q);
        if(p.val > root.val && q.val > root.val) return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}


4,Lowest Common Ancestor of a Binary Tree
给定一个二叉树,找到两个节点的公共祖先。

与第三题不同,它是一个普通的二叉树,我们不能通过值来判断两个节点的位置,我们用深度优先搜索,通过返回值来判断两个节点的位置,代码如下:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if(left != null && right != null) return root;
        if(left == null) 
            return right;
        return left;
    }
}
分享到:
评论

相关推荐

    binarytree.rar

    在LeetCode这样的在线编程平台上,二叉树的题目通常是让你编写一个函数,该函数接收一个二叉树的根节点(通常是作为树节点对象的指针)并返回一个节点值的列表,这个列表反映了前序遍历的顺序。例如,如果给定的...

    leetcode的题目:Balanced Binary Tree

    平衡二叉树(Balanced Binary Tree)是一种特殊的二叉树,它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 平衡二叉树的主要优点在于它能保持较好的搜索性能。在二叉搜索树...

    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

    minimum-depth-of-binary-tree.rar_leetcode

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

    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...

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

    1. Math Implementation Questions(数学实现题) ...5.1 Maximum Depth of Binary Tree(二叉树的深度) 5.2 Invert Binary Tree(反转二叉树) 5.3... 5.4... 5.5... 6. String Questions(字符串相关问题)

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

    - **Validate Binary Search Tree**:验证一个二叉树是否为二叉搜索树。 - **Recover Binary Search Tree**:恢复二叉搜索树中的两个错误节点。 - **Binary Tree Path**:找到二叉树中和为目标值的路径。 - **...

    leetcode110-BinaryTree_HeightBalanced:力扣110

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

    2018年最新Google Onsite面经总结1

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

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

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

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

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

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

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

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

    - 完全二叉树(Complete Binary Tree):除了最后一层外,每一层都被完全填满,且最后一层所有节点都集中在左边。 - 平衡二叉树(Balanced Binary Tree):任何节点的两个子树的高度差不超过1的二叉树。 - 二叉搜索...

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

    1. **图的性质** - 在图论中,一个图如果有每个顶点的度数都是偶数,或者只有两个顶点的度数是奇数,那么可以找到一个哈密顿回路,即一个通过每条边恰好一次的路径。这是欧拉路径和哈密顿路径的一个基本定理。 2. *...

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

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

    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”)包含了这些题目的解决方案或者其他学习资源。开源意味着社区可以贡献、...

    Leetcode book刷题必备

    28. Balanced Binary Tree:判断一个二叉树是否是平衡二叉树。 29. Convert Sorted Array to Balanced Binary Search Tree:将有序数组转换成平衡的二叉搜索树。 30. Convert Sorted List to Balanced Binary Search...

Global site tag (gtag.js) - Google Analytics