C++求解二叉樹(shù)的下一個(gè)結(jié)點(diǎn)問(wèn)題
題目描述
給定一個(gè)二叉樹(shù)其中的一個(gè)結(jié)點(diǎn),請(qǐng)找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。注意,樹(shù)中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn),同時(shí)包含指向父結(jié)點(diǎn)的next指針。下圖為一棵有9個(gè)節(jié)點(diǎn)的二叉樹(shù)。樹(shù)中從父節(jié)點(diǎn)指向子節(jié)點(diǎn)的指針用實(shí)線表示,從子節(jié)點(diǎn)指向父節(jié)點(diǎn)的用虛線表示

示例:
輸入:{8,6,10,5,7,9,11},8
返回:9
解析:這個(gè)組裝傳入的子樹(shù)根節(jié)點(diǎn),其實(shí)就是整顆樹(shù),中序遍歷{5,6,7,8,9,10,11},根節(jié)點(diǎn)8的下一個(gè)節(jié)點(diǎn)就是9,應(yīng)該返回{9,10,11},后臺(tái)只打印子樹(shù)的下一個(gè)節(jié)點(diǎn),所以只會(huì)打印9,如下圖,其實(shí)都有指向左右孩子的指針,還有指向父節(jié)點(diǎn)的指針,下圖沒(méi)有畫(huà)出來(lái)

數(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)樹(shù)的使用。兩個(gè)方法:
1)暴力破解。通過(guò)next指針獲取根結(jié)點(diǎn),對(duì)其進(jìn)行中序排序,排序過(guò)程中用vector存儲(chǔ),然后直接根據(jù)位置輸出即可。
2)結(jié)合中序排序性質(zhì)。若某個(gè)結(jié)點(diǎn)存在右子樹(shù),則右子樹(shù)的最左孩子就是它的下一個(gè)結(jié)點(diǎn);若不存在右子樹(shù),則它的第一個(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;
// 判斷是否存在右子樹(shù)
if(pNode->right)
{
TreeLinkNode* target=pNode->right;
// 取最左孩子
while(target->left)
{
target=target->left;
}
return target;
}
// 不存在右子樹(shù),尋找第一個(gè)右父親
while(pNode->next)
{
if(pNode->next->left==pNode)
return pNode->next;
pNode=pNode->next;
}
return NULL;
}
};到此這篇關(guān)于C++求解二叉樹(shù)的下一個(gè)結(jié)點(diǎn)問(wèn)題的文章就介紹到這了,更多相關(guān)C++二叉樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(71.簡(jiǎn)化路徑),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實(shí)例
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
C++實(shí)現(xiàn)LeetCode(14.最長(zhǎng)共同前綴)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(14.最長(zhǎng)共同前綴),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
Objective-C的內(nèi)省(Introspection)用法小結(jié)
這篇文章主要介紹了Objective-C的內(nèi)省(Introspection)用法,這是面向?qū)ο笳Z(yǔ)言和環(huán)境的一個(gè)強(qiáng)大特性,需要的朋友可以參考下2014-07-07
C語(yǔ)言實(shí)現(xiàn)字符轉(zhuǎn)unix時(shí)間戳的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇C語(yǔ)言實(shí)現(xiàn)字符轉(zhuǎn)unix時(shí)間戳的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06

