数据结构面试题及答案讲解:二叉树专题(上)

本节目标

  • 1、求二叉树的最大深度。(2018年腾讯面试题)
  • 2、判断一个二叉树是否是高度平衡的二叉树。(2020年字节跳动面试真题)
  • 3、根据一棵树的前序遍历与中序遍历构造二叉树(Leetcode105题)

数据结构面试题及答案讲解:二叉树专题(上)_第1张图片

1、求二叉树的最大深度。

OJ链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/submissions/

高频考察的大厂云图:

数据结构面试题及答案讲解:二叉树专题(上)_第2张图片

解题思路:

当前树的深度 = max(左子树深度,右子树深度)+1,所以要求当前树的深度得先递归求出左子树深度和右子树深度。要求出左右子树的深度同样的道理,再往下递归,直到遇到空树,深度直接返回0。

数据结构面试题及答案讲解:二叉树专题(上)_第3张图片

代码实现:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == NULL)
            return 0;

        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);

        return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1;
    }
};

2、判断一个二叉树是否是高度平衡的二叉树

OJ链接:https://leetcode-cn.com/problems/balanced-binary-tree/

高频考察的大厂云图:

数据结构面试题及答案讲解:二叉树专题(上)_第4张图片

解题思路:

什么是高度平衡二叉树?一颗二叉树的左右子树的高度差不超过1,且树中的所有子树都满足这个条件,则称这颗二叉树是高度平衡二叉树。

那么要判断一颗二叉树是否是平衡二叉树可以分为3步:

  1. 求出当前树的左右子树的高度,判断是否满足高度差<=1. 满足则继续第2点
  2. 按第一点的方式,递归检查判断左子树. 满足则继续第3点
  3. 按第一点的方式,递归检查判断右子树. 满足则是高度平衡二叉树

数据结构面试题及答案讲解:二叉树专题(上)_第5张图片

代码实现:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
     int maxDepth(TreeNode* root) {
        if(root == NULL)
            return 0;

        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);

        return leftDepth > rightDepth ? leftDepth+1 : rightDepth+1;
    }

    bool isBalanced(TreeNode* root) {
        if(root == NULL)
            return true;

        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);

        return abs(leftDepth-rightDepth) < 2
            && isBalanced(root->left)
            && isBalanced(root->right);
    }
};

3、根据一棵树的前序遍历与中序遍历构造二叉树。

OJ链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

高频考察的大厂云图:

数据结构面试题及答案讲解:二叉树专题(上)_第6张图片

解题思路:
  1. 前序的顺序为:根、左子树、右子树 中序的顺序为:左子树、根、右子树
  2. 根据前序可以确立前序构建树的每个树的根节点,创建根,再用根节点把中序分割出左子树和右子树的区间,再递归创建坐子树和右子树
  3. 当子树区间为没有数据时,递归返回空。

数据结构面试题及答案讲解:二叉树专题(上)_第7张图片

代码实现:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* _buildTree(vector& preorder, vector& inorder, int& prei, int inbegin, int inend)
    {
        if(inbegin > inend) return nullptr;
        int rootVal = preorder[prei];
        TreeNode* root = new TreeNode(rootVal);
        // 在中序序列中去找root的位置
        int inRooti = inbegin;
        while(inRooti <= inend)
        {
            if(inorder[inRooti] == rootVal)
                break;
            else
                ++inRooti;
        }
        // [inbegin, inRooti-1] inRooti [inRooti+1, inend] 左子树的中序[inbegin, inRooti-1] 右子树的中序[inRooti+1, inend]
        // 如果中序左区间存在则递归创建左子树,如果中序左区间不存在,则左子树是空树
        if(inbegin <= inRooti-1)
            root->left = _buildTree(preorder, inorder, ++prei, inbegin, inRooti-1);
        else
            root->left= nullptr;

        // 同上
         if(inRooti+1 <= inend)
            root->right = _buildTree(preorder, inorder, ++prei, inRooti+1, inend);
        else
            root->right = nullptr;

        return root;
    }

    TreeNode* buildTree(vector& preorder, vector& inorder)
    {
        int prei = 0;
        int inbegin = 0;
        int inend = inorder.size()-1;
        return _buildTree(preorder, inorder, prei, inbegin, inend);
    }
};

如果你有不是很明白的地方,这里有讲解视频哦:
击链接观看:单击链接就可以了

数据结构面试题及答案解析系列如果对你有帮助,请点赞,转发,鼓励博主继续更新下去哦

上一篇:https://blog.csdn.net/bitzhidu/article/details/106474004