- 题目描述:给定一个二叉树和其中一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向夫节点的指针。
- 思想:①当前节点有右子树时,则下一节点是右子树的最左节点。②当前节点没有右子树,但自己是父节点的左孩子时,则下一个节点是父节点。③当前结点既没有右孩子,自己又不是左孩子时,则找到第一个是左孩子的祖先节点,该节点的父亲结点就是下一个结点。④如果当前结点既没有右孩子,又不是左孩子,又没有父节点时,或没有作为左孩子的祖先节点时,则该结点是中序遍历的最后一个结点。
- 代码实现:
typedef struct node { int data; struct node* left; struct node* right; struct node*parent; }Node,*PNode; PNode GetNext(PNode p) { if (p == NULL) { return NULL; } PNode next = NULL; if (p->right != NULL) { //有右子树 next = p->right; while (next->left != NULL) { next = next->left; } } else if (p->parent == NULL) { //无右子树且无父节点,即为无右子树的根结点 next = NULL; } else {//无右子树但有根结点,找出第一个是左子树的祖先节点,这个节点的父结点就是下一个结点 PNode Pcurrent = p, Pparent = p->parent; while (Pparent != NULL && Pcurrent != Pparent->left) { Pparent = Pparent->parent; Pcurrent = Pcurrent->parent; }//循环结束后,父节点为空时,代表没有作为左子树的祖先节点;或当前结点是左子树,则返回其父节点 next = Pparent; } return next; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)