剑指offer之二叉树的下一个结点
生活随笔
收集整理的這篇文章主要介紹了
剑指offer之二叉树的下一个结点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 問題
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點并且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針
?
?
?
?
2 分析
比如我現在的二叉樹如下
42 61 3 5 7這里分3種情況
1) 如果這個節點包含右子樹,那么下一個節點就是這個右子樹的最左下節點,比如節點4的下一個節點是5.
2) 如果這個節點不包含右子樹,如果這個節點的父節點的左子節點是同一個,那么下一個節點就是這個節點的父節點,比如節點6的下一個節點就是7.
3) 如果這個節點不包含右子樹,如果這個節點的父節點的右子節點是同一個,這里分2種情況,我們先找到這節點的父結點,然后父節點的指針一直向上遍歷,直到找到一個是它父結點的左子結點的結點。如果這樣的結點存在,那么這個結點的父結點就是我們要找的下一個結點,比如節點3的下一個節點是4,也有可能沒有下一個節點,比如節點7的下一個節點就是空。
?
?
?
?
?
3 代碼實現
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; }?
總結
以上是生活随笔為你收集整理的剑指offer之二叉树的下一个结点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer之二叉搜索树和双向链表
- 下一篇: 剑指offer之求二叉树中两个节点的最低