面试题58:二叉树的下一个结点
2015-05-04 09:37
239 查看
题目:给定一颗二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。
中序遍历为:DBEFAC
1.结点有左右子树,因为是中序遍历,所以一个结点一定是在右子树中,所以不考虑左子树,直接遍历右子树的最左结点。如A,下一个结点是C
2.结点没有右子树,但是它是父节点的左结点,父节点就是下一个结点,如D
3.结点没有右子树,而且它是父节点的右结点,沿着它父节点向上遍历,直到找到一个是它父节点的左子结点的结点。如F,F的父节点是E,但E是父节点B的右子节点,所以继续往上找,找到B,B是A的左子结点,所以A就是下一个结点,如果没有找到返回NULL。
中序遍历为:DBEFAC
1.结点有左右子树,因为是中序遍历,所以一个结点一定是在右子树中,所以不考虑左子树,直接遍历右子树的最左结点。如A,下一个结点是C
2.结点没有右子树,但是它是父节点的左结点,父节点就是下一个结点,如D
3.结点没有右子树,而且它是父节点的右结点,沿着它父节点向上遍历,直到找到一个是它父节点的左子结点的结点。如F,F的父节点是E,但E是父节点B的右子节点,所以继续往上找,找到B,B是A的左子结点,所以A就是下一个结点,如果没有找到返回NULL。
struct BTNode { int value; BTNode* left; BTNode* right; BTNode* parent; }; BTNode * GetNext(BTNode * node) { if(node==NULL) return NULL; BTNode * pNext=NULL; //如果结点的右子树不为空 if(node->right!=NULL) { BTNode * currentNode=node->right; //向下找到最左的结点 while(currentNode->left!=NULL) { currentNode=currentNode->left; } pNext=currentNode; } else if(node->parent!=NULL)//如果结点的父节点不为空 { BTNode * currentNode=node; BTNode * parent=node->parent; //如果当前结点不是它父节点的子节点,就一直向上找,如果是,则它的父节点就是下一个结点 while(currentNode!=parent->left&&parent!=NULL) { currentNode=parent; parent=parent->parent;//向上查找父节点 } pNext=parent; } return pNext; }
相关文章推荐
- 剑指offer——面试题58:二叉树的下一个结点
- 剑指offer面试题[58]-二叉树的下一个结点
- 面试题58:二叉树的下一个结点
- 面试题58 二叉树的下一个结点
- 剑指offer 面试题58 二叉树的下一个结点
- 【剑指Offer学习】【面试题58:二叉树的下一个结点】
- 面试题58:二叉树中的下一个结点
- 面试题58-二叉树的下一个结点
- 剑指offer——面试题58:二叉树的下一个结点
- (剑指Offer)面试题58:二叉树的下一个结点
- 剑指offer面试题[58]-二叉树的下一个结点
- 剑指offer-面试题58:二叉树的下一个结点
- [剑指offer]面试题58:二叉树中的下一个结点
- 面试题58:二叉树的下一个结点
- 《剑指Offer》学习笔记--面试题58:二叉树的下一个结点
- 【剑指Offer】面试题58:二叉树的下一个结点
- 剑指offer-面试题58-二叉树的下一个结点
- 剑指offer--面试题8:二叉树的下一个结点
- 面试题65:二叉树的下一个结点
- 剑指Offer面试题58:二叉树的下一个节点