C++求解二叉樹的下一個(gè)結(jié)點(diǎn)問題
題目描述
給定一個(gè)二叉樹其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。注意,樹中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn),同時(shí)包含指向父結(jié)點(diǎn)的next指針。下圖為一棵有9個(gè)節(jié)點(diǎn)的二叉樹。樹中從父節(jié)點(diǎn)指向子節(jié)點(diǎn)的指針用實(shí)線表示,從子節(jié)點(diǎn)指向父節(jié)點(diǎn)的用虛線表示
示例:
輸入:{8,6,10,5,7,9,11},8
返回:9
解析:這個(gè)組裝傳入的子樹根節(jié)點(diǎn),其實(shí)就是整顆樹,中序遍歷{5,6,7,8,9,10,11},根節(jié)點(diǎn)8的下一個(gè)節(jié)點(diǎn)就是9,應(yīng)該返回{9,10,11},后臺(tái)只打印子樹的下一個(gè)節(jié)點(diǎn),所以只會(huì)打印9,如下圖,其實(shí)都有指向左右孩子的指針,還有指向父節(jié)點(diǎn)的指針,下圖沒有畫出來
數(shù)據(jù)范圍:節(jié)點(diǎn)數(shù)滿足1≤n≤50 ,節(jié)點(diǎn)上的值滿足1≤val≤100
要求:空間復(fù)雜度 O(1) ,時(shí)間復(fù)雜度 O(n)
示例:
輸入:
{8,6,10,5,7,9,11},8
返回值:
9
解題思路
本題考察數(shù)據(jù)結(jié)構(gòu)樹的使用。兩個(gè)方法:
1)暴力破解。通過next指針獲取根結(jié)點(diǎn),對(duì)其進(jìn)行中序排序,排序過程中用vector存儲(chǔ),然后直接根據(jù)位置輸出即可。
2)結(jié)合中序排序性質(zhì)。若某個(gè)結(jié)點(diǎn)存在右子樹,則右子樹的最左孩子就是它的下一個(gè)結(jié)點(diǎn);若不存在右子樹,則它的第一個(gè)右父親,就是它的下一個(gè)結(jié)點(diǎn)。
測(cè)試代碼
1)暴力破解
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; // 確定根結(jié)點(diǎn) TreeLinkNode* root=pNode; while(root->next) { root=root->next; } // 中序排序 vector<TreeLinkNode*> v; inorder(root,v); for(int i=0;i<v.size();++i) { if(v[i]==pNode&&(i+1)<v.size()) return v[i+1]; } return NULL; } // 排序 void inorder(TreeLinkNode* root,vector<TreeLinkNode*> &v) { if(!root) return; // 中序排序 inorder(root->left,v); v.push_back(root); inorder(root->right,v); } };
2)結(jié)合中序排序性質(zhì)
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; // 判斷是否存在右子樹 if(pNode->right) { TreeLinkNode* target=pNode->right; // 取最左孩子 while(target->left) { target=target->left; } return target; } // 不存在右子樹,尋找第一個(gè)右父親 while(pNode->next) { if(pNode->next->left==pNode) return pNode->next; pNode=pNode->next; } return NULL; } };
到此這篇關(guān)于C++求解二叉樹的下一個(gè)結(jié)點(diǎn)問題的文章就介紹到這了,更多相關(guān)C++二叉樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)掃雷小游戲(控制臺(tái))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05cmake跨平臺(tái)構(gòu)建工具的學(xué)習(xí)筆記
CMake是一個(gè)跨平臺(tái)的安裝/編譯工具,通過CMake我們可以通過簡(jiǎn)單的語句來描述所有平臺(tái)的安裝/編譯過程,下面這篇文章主要給大家介紹了關(guān)于cmake跨平臺(tái)構(gòu)建工具的相關(guān)資料,需要的朋友可以參考下2023-02-02Qt串口通信開發(fā)之QSerialPort模塊簡(jiǎn)單使用方法與實(shí)例
這篇文章主要介紹了Qt串口通信開發(fā)之QSerialPort模塊簡(jiǎn)單使用方法與實(shí)例,需要的朋友可以參考下2020-03-03C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C++基于QWidget和QLabel實(shí)現(xiàn)圖片縮放,拉伸與拖拽
這篇文章主要為大家詳細(xì)介紹了C++如何基于QWidget和QLabel實(shí)現(xiàn)圖片縮放、拉伸與拖拽等功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02C++11中bind綁定器和function函數(shù)對(duì)象介紹
這篇文章主要介紹了C++11中bind綁定器和function函數(shù)對(duì)象介紹,綁定器,函數(shù)對(duì)象和lambda表達(dá)式只能使用在一條語句中,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-07-07