劍指offer之二叉樹的下一個結(jié)點
1 問題
給定一個二叉樹和其中的一個結(jié)點,請找出中序遍歷順序的下一個結(jié)點并且返回。注意,樹中的結(jié)點不僅包含左右子結(jié)點,同時包含指向父結(jié)點的指針
2 分析
比如我現(xiàn)在的二叉樹如下
4
2 6
1 3 5 7
這里分3種情況
1) 如果這個節(jié)點包含右子樹,那么下一個節(jié)點就是這個右子樹的最左下節(jié)點,比如節(jié)點4的下一個節(jié)點是5.
2) 如果這個節(jié)點不包含右子樹,如果這個節(jié)點的父節(jié)點的左子節(jié)點是同一個,那么下一個節(jié)點就是這個節(jié)點的父節(jié)點,比如節(jié)點6的下一個節(jié)點就是7.
3) 如果這個節(jié)點不包含右子樹,如果這個節(jié)點的父節(jié)點的右子節(jié)點是同一個,這里分2種情況,我們先找到這節(jié)點的父結(jié)點,然后父節(jié)點的指針一直向上遍歷,直到找到一個是它父結(jié)點的左子結(jié)點的結(jié)點。如果這樣的結(jié)點存在,那么這個結(jié)點的父結(jié)點就是我們要找的下一個結(jié)點,比如節(jié)點3的下一個節(jié)點是4,也有可能沒有下一個節(jié)點,比如節(jié)點7的下一個節(jié)點就是空。
3 代碼實現(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)驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)