1. 程式人生 > 其它 >使用C#讀取XML資料的三種方法

使用C#讀取XML資料的三種方法

✅做題思路or感想:

  • 遞迴一條邊的寫法:

    if (dfs(root->left))return;
    if (dfs(root->right))return;
    
  • 搜尋整棵樹的寫法

    left = dfs(root->left);
    right = dfs(root->right);
    //left與right的邏輯處理
    

在遞迴函式又返回值的情況下:

  • 如果搜尋一條邊,那麼在遞迴函式的返回值不為空的時候,立刻返回
  • 如果搜尋整棵樹,則直接用變數leftright儲存返回值,接下來的邏輯就是用變數leftright來處理當前節點

方法一:就當作一顆普通二叉樹來做

用後序遍歷從底部開始往上遍歷,因為是要找最近公共祖先,所以要搜尋整棵樹!

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;
    }
};