二叉树的下一个节点
题目来源:《剑指offer》面试题58
题目:给定一个二叉树和其中一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。
分析:有如下几种情况:
如果一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。
如果没有右子树,且它是父节点的左子节点,那么它的下一个节点就是它的父节点。
如果一个节点即没有右子树,并且它还是父节点的右子节点,这种情况比较复杂。我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。
如果一个节点不满足上述所有情况,那么它应该就是中序遍历的最后一个节点。所以返回NULL
struct BinaryTreeNode { int val; BinaryTreeNode* parent; BinaryTreeNode* left; BinaryTreeNode* right; }; BinaryTreeNode* GetNext(BinaryTreeNode* root) { if (root == NULL) return NULL; BinaryTreeNode* next_node = NULL; //如果节点有右子树,那么它的下一个节点就是它的右子树中最左边的节点 if (root->right != NULL) { next_node = root->right; while (next_node->left != NULL) next_node = next_node->left; return next_node; } if (root->parent != NULL) { if (root == root->parent->left) {//当前节点是父节点的左子节点 return root->parent; } else { BinaryTreeNode* parent_node = root->parent; BinaryTreeNode* current_node = root; while (parent_node != NULL && current_node == parent_node->left) { current_node = parent_node; parent_node = parent_node->parent; } return parent_node; } } return NULL; }