题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
Case1: p有右子树, 答案next就是右子树最左节点 Case2: p 无右子树, 且是父节点的左儿子,next就是父节点 Case3: p 无右子树, 且是父节点的右儿子,那么沿着右分支往上一直找父节点,当前节点cur = parent; 当前节点的父节点parent = parent -> m_pParent; 直到父节点parent是null(这时cur是根节点),或者还有父节点但是已经不是沿右分支了(parent -> m_pRight != cur),那么这第一个左分支的父节点(parent)就是next。
BinaryTreeNode *getNextNode(BinaryTreeNode *p) { // 不用传根,p带的就是树的信息 if (p == NULL) return NULL; BinaryTreeNode *nextNode = NULL; // 可以覆盖p是最后一个节点情况 if(p -> m_pRight != NULL) { // case1 BinaryTreeNode *right = p -> m_pRight; while (right -> m_pLeft != NULL) right = right -> m_pLeft; nextNode = right; }else if (p -> m_pParent != NULL) { // case2,3 可以一起处理 BinaryTreeNode *parent = p -> m_pParent; BinaryTreeNode *cur = p; // case2 不会进入这个循环,因为不满足第二个条件 while (parent != NULL && parent -> m_pRight== cur) {//沿右分支找父亲 cur = parent; parent = parent -> m_pParent; } // 循环结束,case3就转换到和case2的情况了 nextNode = parent; // 下一个节点就是父节点 } return nextNode; // 如果p是最后一个节点,上面if else都不会执行 }