《剑指offer》二叉树的下一个结点
2016-09-21 08:58
381 查看
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解法:
1.只有两种情况:1)该结点有右子树,那么下一个结点就是该右子树里面最左的那个结点。描述语言为if(pNode->right != NULL) pRight = pNode->right; while(pRight->left != NULL) {pRight = pRight->left;} pNext = pRight; 2)该结点没有右子树,那么就只要判定它的根结点是否为根的根结点的左子树即可,一直寻找到这样存在的点。描述语言为if(pNode->next != NULL)while(pPre !=
NULL && current->next == pPre->right) {current = pPre; pPre = pPre->next;} pNext = pPre;
2.总结,这道题应该不算难的,只要分类搞清楚两种情况的判定方法,即可以做出来。
using namespace std; /* 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 == NULL) return NULL; //结点的右子树存在 TreeLinkNode* pRight; TreeLinkNode* pNext = NULL; if(pNode->right != NULL) { //下一个结点为右子树中最左的结点 pRight = pNode->right; while(pRight->left != NULL) { pRight = pRight->left; } pNext = pRight; } //结点的右子树不存在,那么就继续向父结点搜索 else if(pNode->next != NULL) { TreeLinkNode* current; TreeLinkNode* pPre; current = pNode; pPre = pNode->next; while(pPre != NULL && current == pPre->right) { current = pPre; pPre = pPre->next; } pNext = pPre; } return pNext; } };
相关文章推荐
- 剑指offer 二叉树的下一个结点
- 《剑指offer》刷题笔记(树):二叉树的下一个结点
- 剑指offer面试题[58]-二叉树的下一个结点
- 剑指Offer(8)二叉树的下一个结点
- 剑指offer-面试题58-二叉树的下一个结点
- 《剑指Offer》学习笔记--面试题58:二叉树的下一个结点
- 剑指offer——二叉树的下一个结点(好题)
- 剑指offer——57.二叉树的下一个结点
- 剑指offer-面试题58:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指Offer——二叉树的下一个结点
- 《剑指offer》——二叉树的下一个结点
- 《剑指offer》二叉树的下一个结点
- 《剑指offer》:[58]二叉树的下一个结点
- 《剑指offer》-- 二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- (剑指Offer)面试题58:二叉树的下一个结点
- 剑指offer(C++)——二叉树的下一个结点
- 二叉树的下一个结点
- 二叉树的下一个结点