使用C#讀取XML資料的三種方法
阿新 • • 發佈:2022-03-27
✅做題思路or感想:
-
遞迴一條邊的寫法:
if (dfs(root->left))return; if (dfs(root->right))return;
-
搜尋整棵樹的寫法
left = dfs(root->left); right = dfs(root->right); //left與right的邏輯處理
在遞迴函式又返回值的情況下:
- 如果搜尋一條邊,那麼在遞迴函式的返回值不為空的時候,立刻返回
- 如果搜尋整棵樹,則直接用變數
left
和right
儲存返回值,接下來的邏輯就是用變數left
和right
來處理當前節點
方法一:就當作一顆普通二叉樹來做
用後序遍歷從底部開始往上遍歷,因為是要找最近公共祖先,所以要搜尋整棵樹!
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { //遞迴中止條件 if (root == nullptr || root == p || root == q)return root; //後序遍歷 TreeNode* left = lowestCommonAncestor(root->left, p, q); TreeNode* right = lowestCommonAncestor(root->right, p, q); //單層邏輯:由左右子樹遞迴的結果來判斷該節點是不是最近公共祖先 //是,則返回值 if (left == p && right == q || left == q && right == p)return root; //不是,則繼續傳遞遞迴的資訊 else if (!left && right)return right; else if (left && !right)return left; else return nullptr; } };
但這種方法完全沒有用到二叉搜尋樹的特性,暴珍天物啊
方法二:利用二叉搜尋樹的性質
如果cur
節點的數值在[p, q]區間,則說明該節點cur就是最近公共祖先
明白上面的話後,就直接照做就好了
但是可以利用二叉搜尋樹的特性,如果節點值大於這個區間,就往左子樹跑,如果小於這個區間,就往右子樹跑
class Solution { public: bool flag = 1; TreeNode* result = nullptr; void dfs(TreeNode* cur, TreeNode* max, TreeNode* min) { if (flag == 1) { //這個flag可有可無,我自己習慣加的,用來控制遞迴的進行與否 if (cur == nullptr)return; //遞迴中止條件,其實這裡也是可有可無,因為不可能遍歷到空節點的 if (cur->val <= max->val && cur->val >= min->val) { //這裡注意是大於等於和小於等於,題目裡有說祖先節點可以是那兩個節點的本身,故是閉區間[p, q] result = cur; flag = 0; return; } //根據二叉搜尋樹的特性 if (cur->val > max->val)dfs(cur->left, max, min); if (cur->val < min->val)dfs(cur->right, max, min); } } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (q->val > p->val)swap(p, q); //細節,這裡必須讓p是大的那個!當然也可以讓q是大的那個,隨自己喜歡 dfs(root, p, q); return result; } };