理解二叉樹遞迴中的自底向上和自頂向下兩種思想
前言:一直搞不清楚自頂向下
和自底向上
的區別
下面從幾個例子來簡要分析
一、區分兩個概念:
自頂向下:直接return 函式呼叫自身下一級實現
,比如 return Fibonacci(n-1) + Fibonacci(n-2);
自底向上:先遞迴到最小單位(葉子節點),再從最小單位往上拋結果,傳遞結果
二、具體事例分析:
/**
* 兩種遍歷方向,計算最大深度
* 自頂向下
* 自底向上
*
* @Auther:sommer1111
* @date 2020/11/10 19:05
*/
public class _11_10_Top_Down {
//自頂向下
private int answer;
private void maximum_depth(TreeNode root, int depth) {
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
answer = Math.max(answer, depth);
}
maximum_depth(root.left, depth + 1);
maximum_depth(root.right, depth + 1);
}
//自底向上
public int maximum_depth(TreeNode root) {
if (root == null) {
return 0;
}
//感受一下這裡是將最底層的結果往上拋
//,因為這裡的遞迴邊界條件是葉子節點
int left_depth = maximum_depth(root.left);
int right_depth = maximum_depth(root.right);
return Math.max(left_depth, right_depth) + 1;
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
* LettCode中的題:
* 235. 二叉搜尋樹的最近公共祖先
* 236. 二叉樹的最近公共祖先
*/
class Solution {
//搜尋二叉樹直接可以分為比大小,定位
//分為都在左子樹、都在右子樹、兩邊(root)
public TreeNode lowestCommonAncestor235(TreeNode root, TreeNode p, TreeNode q) {
if(p.val<root.val && q.val<root.val){
//這裡就是自頂向下
return lowestCommonAncestor235(root.left,p,q);
}
if(p.val>root.val && q.val>root.val){
return lowestCommonAncestor235(root.right,p,q);
}
return root;
}
//遞迴自底向上,討論子樹中是否含有某個節點
// 如果分別在左右子樹,則返回跟節點
// 如果在同一個子樹繼續往下遞迴
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null ||root==p || root==q){
return root;
}else{
//著也是自底向上的思想
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left==null && right==null){
return null;
}
if(left==null){
return right;
}
if(right==null){
return left;
}
return root;
}
}
}
相關文章
- 在SOLIDWORKS中自底向上與自頂向下裝配體建模有什麼不同?Solid
- 程式設計中的自頂向下設計思想程式設計
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 向上向下傳遞資料
- 遞迴思想的巧妙理解遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 自頂向下 | TCP擁塞控制TCP
- 二叉樹的遞迴套路二叉樹遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 徹底理解遞迴,從遞迴的本質說起!遞迴
- 二叉樹的前序、中序、後序的遞迴和迭代實現二叉樹遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 講透樹4 | 非自頂向下類別題目覆盤專題
- 二叉平衡樹 python 列表 遞迴Python遞迴
- 向上轉型和向下轉型
- Java中用遞迴和迭代實現二叉樹的中序( InOrder )遍歷Java遞迴二叉樹
- 自頂向下語法分析複習總結語法分析
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- SQL 遞迴思想SQL遞迴
- 遞迴判斷是否二叉平衡樹遞迴
- win10電腦中滑鼠自動向下或向上滾動怎麼解決Win10
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 【Redis】內部資料結構自頂向下梳理Redis資料結構
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 【根據前序和中序遍歷構造二叉樹】棧+迭代 || 遞迴二叉樹遞迴
- 【每日一題】二叉樹的前中後序非遞迴整理每日一題二叉樹遞迴
- Python中關於++和—(自增和自減)的理解Python
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- Day14 | 二叉樹遞迴遍歷二叉樹遞迴
- 二叉樹 遞迴 洛谷P1364二叉樹遞迴
- 二叉樹(資料結構)——利用“遞迴”思想實現相關演算法問題二叉樹資料結構遞迴演算法
- 二叉樹的建立與遍歷(遞迴實現)二叉樹遞迴