劍指Offer的學習筆記(C#篇)-- 序列化二叉樹

題目描述

請實現兩個函數,分別用來序列化和反序列化二叉樹

一 . 理解題意函數

        二叉樹的序列化,是將一個結構化的東西變成扁平化的字符串,序列化二叉樹或者是反序列化二叉樹就是二叉樹和擴展二叉樹遍歷序列之間的轉換。將二叉樹中的沒個結點的空指針引出一個虛節點,其值爲一個特定值,好比說 # 字符,咱們成這種處理後的二叉樹爲原來二叉樹的擴展二叉樹。擴展二叉樹和二叉樹是一一對應關係。因此下圖的前序的序列化序列爲:A B # D # # C # #。工具

二 . 代碼實現與分析spa

class Solution
    {
        public string Serialize(TreeNode root)
        {
            string result = "";
            //遞歸結束條件
            if (root == null)
            {
                result += "#,";
                //最終輸出
                return result;
            }
            //序列化加數
            result += root.val + ",";
            //遞歸左子節點
            result += Serialize(root.left);
            //遞歸右子節點
            result += Serialize(root.right);
            //輸出(非最終)
            return result;
        }
        //把它放在外面是有用意的,由於裏面爲了構造一個連加,這個是爲了搞第一個數。
        private int index = -1;
        public TreeNode Deserialize(string str)
        {
            index += 1;
            TreeNode tmp= null;
            //去掉,
            string[] strList = str.Split(',');
            //子節點結束條件
            if (strList[index] != "#")
            {
                //把這個序列化裏面的數一個個揪出來
                tmp = new TreeNode(int.Parse(strList[index]));
                //左子節點遍歷
                tmp.left = Deserialize(str);
                //右子節點遍歷
                tmp.right = Deserialize(str);
            }
            //反序列化輸出
            return tmp;
        }
    }

        又涉及到雙遞歸了,雙遞歸就要涉及到棧的知識,我的感受很麻煩,不過遞歸記住兩個點就行了。點1:遞歸中止條件。點二:遞歸內容。指針

        其實最近的筆記一直是手寫的,沒有用畫圖工具精心去作,一來呢,手寫更能夠好好的思考,二就是比較快嘛,啊哈哈哈哈...........code

相關文章
相關標籤/搜索