劍指offer之序列化 第k大節點 雙向鍊錶

2021-10-04 22:01:18 字數 1536 閱讀 5005

37.序列化二叉樹

題目:請實現兩個函式,分別用來序列化二叉樹和反序列化二叉樹

序列化二叉樹思路:

第一種方法:可以從前序遍歷和中序遍歷序列中構造一棵二叉樹

缺點:1.該方法要求二叉樹中不能有重複的節點 

2.只有當兩個序列中所有資料都讀出來後才開始反序列化,效率較慢

第二種方法:根據前序遍歷來序列化二叉樹。在遍歷二叉樹碰到nullptr時,將nullptr序列化為乙個特殊的字元

如『$』。另外數值之間要用『,』隔開

反序列化二叉樹思路:當資料碰到『$』也就是nullptr時 返回它的父節點,繼續遍歷下乙個節點

:isotream:1.istream從流中讀取

2.    ostream寫到流中去

fstream:1.ifstream從檔案中讀取

2.ofstream寫道檔案中去

sstream:1.istringstream從string物件中讀取

2.ostringstream寫道string物件中去

#includeusing namespace std;

struct treenode

};//序列化

void serialize(treenode* proot,ostream& stream)

streamserialize(proot->left,stream);

serialize(proot->right,stream); }

//反序列化

void deserialize(treenode**proot,istream& stream)

}

54.二叉搜尋樹第k大節點

題目:給定一棵二叉搜尋樹,請找出其中的第k大的結點。

例如, (5,3,7,2,4,6,8)    中,按結點數值大小順序第三小結點的值為4。

思路:根據中序遍歷的規律,中序遍歷後的數值時遞增排序的

注意:指標判空處理

/*

struct treenode

};*/

class solution

//中序遍歷,將節點依次壓入vector中

void inorder(treenode* proot,vector& vec)

};

36.二叉樹與雙向鍊錶

題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路:依據中序遍歷從小到大的原則  鏈結左子樹最後大的節點和根節點的雙向指標和根節點與右子樹最小的節點相連線即可

/*

struct treenode

};*/

class solution

void convertnode(treenode*pnode,treenode**plastnodeinlist)

};

劍指offer之序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹。兩個函式分別是 char serialize treenode root treenode deserialize char str 系列化和反系列化都應該是一樣的遍歷方式,或者前序遍歷或者中序遍歷或者後序遍歷。但是為了方便,我們使用前序遍歷,第乙個字...

劍指offer 二叉搜尋樹的第K大節點

給定一棵二叉搜尋樹,請找出其中的第k大的結點。例如,5,3,7,2,4,6,8 中,按結點數值大小順序第三大結點的值為4。struct treenode 思路 二叉搜尋樹按照中序遍歷的順序列印出來正好就是排序好的順序。所以,按照中序遍歷順序找到第k個結點就是結果。class solution tre...

劍指offer 第k大元素

第k大元素 給出陣列 9,3,2,4,8 第三大的元素是4 給出陣列 1,2,3,4,5 第一大的元素是5,第二大的元素是4,第三大的元素是3,以此類推 這是一道非常重要的筆試題,思路有三 1.最直觀的,就是排下序,取第k大的元素就行了。但是時間複雜度有點高,o nlgn 2.利用類似於快速排序中的...