数据结构面试题及答案讲解:二叉树专题(上)
数据结构面试题及答案讲解:二叉树专题(上)
本节目标
-
1、求二叉树的最大深度。(2018年腾讯面试题)
-
2、判断一个二叉树是否是高度平衡的二叉树。(2020年字节跳动面试真题)
-
3、根据一棵树的前序遍历与中序遍历构造二叉树(Leetcode105题)
1、求二叉树的最大深度。
OJ链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/submissions/
高频考察的大厂云图:
解题思路:
当前树的深度 = max(左子树深度,右子树深度)+1,所以要求当前树的深度得先递归求出左子树深度和右子树深度。要求出左右子树的深度同样的道理,再往下递归,直到遇到空树,深度直接返回0。
代码实现:
/**
* 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、判断一个二叉树是否是高度平衡的二叉树
高频考察的大厂云图:
解题思路:
什么是高度平衡二叉树?一颗二叉树的左右子树的高度差不超过1,且树中的所有子树都满足这个条件,则称这颗二叉树是高度平衡二叉树。
那么要判断一颗二叉树是否是平衡二叉树可以分为3步:
- 求出当前树的左右子树的高度,判断是否满足高度差<=1. 满足则继续第2点
- 按第一点的方式,递归检查判断左子树. 满足则继续第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;
}
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/
高频考察的大厂云图:
解题思路:
- 前序的顺序为:根、左子树、右子树 中序的顺序为:左子树、根、右子树
- 根据前序可以确立前序构建树的每个树的根节点,创建根,再用根节点把中序分割出左子树和右子树的区间,再递归创建坐子树和右子树
- 当子树区间为没有数据时,递归返回空。
代码实现:
/**
* 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<int>& preorder, vector<int>& 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<int>& preorder, vector<int>& inorder)
{
int prei = 0;
int inbegin = 0;
int inend = inorder.size()-1;
return _buildTree(preorder, inorder, prei, inbegin, inend);
}
};
如果你有不是很明白的地方,这里有讲解视频哦:
[video(video-T4AZHom4-1591179209073)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=753426482)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/58bc36a7223c3ce07b2105e28174e1696c7f3a2e.png)(title-数据结构高频面试题之二叉树(上)(C++实现))]
或者点击链接观看:单击链接就可以了
数据结构面试题及答案解析系列如果对你有帮助,请点赞,转发,鼓励博主继续更新下去哦
上一篇:https://blog.csdn.net/bitzhidu/article/details/106474004
博主和团队推出一个免费的公众号栏目:IT笔试面试真题讲解,每天发布一个视频讲解IT公司笔试面试真题。
欢迎扫码关注哦