树(Tree)

树的结构十分直观,而树的很多概念定义都有一个相同的特点:递归,也就是说,一棵树要满足某种性质,往往要求每个节点都必须满足。例如,在定义一棵二叉搜索树时,每个节点也都必须是一棵二叉搜索树。

正因为树有这样的性质,大部分关于树的面试题都与递归有关,换句话说,面试官希望通过一道关于树的问题来考察你对于递归算法掌握的熟练程度。

在面试中常考的树的形状有:普通二叉树、平衡二叉树、完全二叉树、二叉搜索树、四叉树(Quadtree)、多叉树(N-ary Tree)。

对于一些特殊的树,例如红黑树(Red-Black Tree)、自平衡二叉搜索树(AVL Tree),一般在面试中不会被问到,除非你所涉及的研究领域跟它们相关或者你十分感兴趣,否则不需要特别着重准备。

关于树的考题,无非就是要考查树的遍历以及序列化(serialization)。

树的形状

  • 前序遍历(Preorder Traversal)

  方法:先访问根节点,然后访问左子树,最后访问右子树。在访问左、右子树的时候,同样,先访问子树的根节点,再访问子树根节点的左子树和右子树,这是一个不断递归的过程。

  • 中序遍历(Inorder Traversal)

  方法:先访问左子树,然后访问根节点,最后访问右子树,在访问左、右子树的时候,同样,先访问子树的左边,再访问子树的根节点,最后再访问子树的右边。

  • 后序遍历(Postorder Traversal)

  方法:先访问左子树,然后访问右子树,最后访问根节点。  

LeetCode 第 230 题:给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 

说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

def kthSmallest(self, root: TreeNode, k: int) -> int:
    if not root:return None
    stack,cur=[],root
    res=[]
    while stack or cur:
        if cur:
            stack.append(cur)
            cur=cur.left
        else:
            cur=stack.pop()
            res.append(cur.val)
            if len(res)==k:return res[-1]
            cur=cur.right
原文地址:https://www.cnblogs.com/zhaoyingjie/p/13997400.html