劍指offer之二叉樹的下一個(gè)結(jié)點(diǎn)
1 問題
給定一個(gè)二叉樹和其中的一個(gè)結(jié)點(diǎn),請找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回。注意,樹中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn),同時(shí)包含指向父結(jié)點(diǎn)的指針
2 分析
比如我現(xiàn)在的二叉樹如下
4
2 6
1 3 5 7
這里分3種情況
1) 如果這個(gè)節(jié)點(diǎn)包含右子樹,那么下一個(gè)節(jié)點(diǎn)就是這個(gè)右子樹的最左下節(jié)點(diǎn),比如節(jié)點(diǎn)4的下一個(gè)節(jié)點(diǎn)是5.
2) 如果這個(gè)節(jié)點(diǎn)不包含右子樹,如果這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)的左子節(jié)點(diǎn)是同一個(gè),那么下一個(gè)節(jié)點(diǎn)就是這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),比如節(jié)點(diǎn)6的下一個(gè)節(jié)點(diǎn)就是7.
3) 如果這個(gè)節(jié)點(diǎn)不包含右子樹,如果這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)的右子節(jié)點(diǎn)是同一個(gè),這里分2種情況,我們先找到這節(jié)點(diǎn)的父結(jié)點(diǎn),然后父節(jié)點(diǎn)的指針一直向上遍歷,直到找到一個(gè)是它父結(jié)點(diǎn)的左子結(jié)點(diǎn)的結(jié)點(diǎn)。如果這樣的結(jié)點(diǎn)存在,那么這個(gè)結(jié)點(diǎn)的父結(jié)點(diǎn)就是我們要找的下一個(gè)結(jié)點(diǎn),比如節(jié)點(diǎn)3的下一個(gè)節(jié)點(diǎn)是4,也有可能沒有下一個(gè)節(jié)點(diǎn),比如節(jié)點(diǎn)7的下一個(gè)節(jié)點(diǎn)就是空。
3 代碼實(shí)現(xiàn)
typedef struct Tree
{
int value;
struct Tree* left;
struct Tree* right;
struct Tree* parent;
Tree(int value) : value(value), left(NULL), right(NULL), parent(NULL) {}
Tree() : value(0), left(NULL), right(NULL), parent(NULL) {}
} Tree;
Tree* getNext(Tree* node)
{
if (NULL == node)
return NULL;
Tree* nextNode = NULL;
if (NULL != node->right)
{
Tree* rightNode = node->right;
while (rightNode->left != NULL)
{
rightNode = rightNode->left;
}
nextNode = rightNode;
}
else
{
Tree* currentNode = node;
Tree* parentNode = currentNode->parent;
while (NULL != parentNode && parentNode->right == currentNode)
{
currentNode = parentNode;
parentNode = currentNode->parent;
}
nextNode = parentNode;
}
return nextNode;
}
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)