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); // 右 }};