902 字
5 分钟
算法 : 二叉树

一般有三种遍历方式:

先序遍历:见自顶向下 DFS。 中序遍历:见二叉搜索树。 后序遍历:见 自底向上 DFS。 带着问题去做下面的题目:

一般来说,DFS 的递归边界是空节点。在什么情况下,要额外把叶子节点作为递归边界?
在什么情况下,DFS 需要有返回值?什么情况下不需要有返回值?
在什么情况下,题目更适合用自顶向下的方法解决?什么情况下更适合用自底向上的方法解决?

遍历二叉树#

自顶向下 DFS(先序遍历)#

在「递」的过程中维护值。

有些题目自顶向下和自底向上都可以做。有些题目也可以用 BFS 做。

自底向上 DFS(后序遍历)#

在「归」的过程中计算

class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p == nullptr || q == nullptr){
return p == q;
}
return p->val == q->val && isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}
};

§自底向上 DFS:删点#

class Solution {
public:
TreeNode* pruneTree(TreeNode* root) {
if (root == nullptr) return nullptr;
root->left = pruneTree(root->left);
root->right = pruneTree(root->right);
if (root->val == 0 && root->left == nullptr && root->right == nullptr) {
return nullptr;
}
return root;
}
};

§有递有归#

§二叉树的直径#

§回溯#

§最近公共祖先#

§二叉搜索树#

一般是中序遍历。

搜索树中序遍历的结果是递增的.

class Solution {
long long pre = LLONG_MIN;
public:
bool isValidBST(TreeNode* root) {
if (root == nullptr) {
return true;
}
if (!isValidBST(root->left)) { // 左
return false;
}
if (root->val <= pre) { // 中
return false;
}
pre = root->val;
return isValidBST(root->right); // 右
}
};
算法 : 二叉树
https://dingfengbo.vercel.app/posts/算法/二叉树/
作者
Eureka
发布于
2026-05-07
许可协议
CC BY-NC-SA 4.0