树必刷题
leetcode题解树:
-
递归
1.树的高度
2.二叉平衡树
3.两节点的最长路径
4.翻转树
5.归并两颗树
6.判断路径和是否等于一个数
7.统计路径和等于一个数的路径数量
8.子树
9.树的对称
10.最小路径
11.统计左叶子节点的和
12.相同节点值的最大路径长度
13.间隔遍历
14.找出二叉树中的第二小的节点 -
层次遍历
1.一棵树每层节点的平均数
2.得到左下角的节点 -
前中后序遍历
1.非递归实现二叉树的前序遍历
2.非递归实现二叉树的后序遍历
3.非递归实现二叉树的中序遍历 -
BST
1.修剪二叉查找树
2.寻找二叉查找树的第K个元素
3.把二叉查找树每个节点的值都加上比它大的节点的值
4.二叉查找树的最近公共祖先
5.二叉树的最近公共祖先
6.从有序数组中构造二叉查找树
7.根据有序链表构造平衡的二叉查找树
8.在二叉查找树中寻找两个节点,使他们和为一个给定值
9.在二叉查找树种查找两个节点之差的最小绝对值
10.寻找二叉查找树种出现次数最多的值 -
Trie
1.实现一个Trie
2.实现一个Trie,用来求前缀和
准备知识
相关见https://blog.youkuaiyun.com/qq_48176859/article/details/109702477
题解
1.递归
递归的思路在树种应用的颇为频繁,需要重点掌握。
1)树的高度
题意:
利用DFS的解法:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==nullptr) return 0;
else
return 1+max(maxDepth(root->left),maxDepth(root->right));
}
};
2)平衡树
题意:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(root==nullptr) return true;
if(abs(getlength(root->left)-getlength(root->right))<=1){
if(isBalanced(root->left) && isBalanced(root->right)) return true;
else return false;
}
else return false;
}
int getlength(TreeNode* root){
if(root==nullptr) return 0;
return 1+max(getlength(root->left),getlength(root->right));
}
};