面试题58:二叉树的下一个结点

来源:互联网 发布:淘宝更换手机号 编辑:程序博客网 时间:2024/06/05 00:41

题目:给定一颗二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。



中序遍历为: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;}


0 0
原创粉丝点击