CodeTop:补充题 12. 二叉树的下一个结点
牛客网:[编程题]二叉树的下一个结点
题目
给定二叉树其中的一个结点,请找出其中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,而且包含指向父结点的指针。
示例:
输入:{8,6,10,5,7,9,11},8输出:9
输入:{8,6,10,5,7,9,11},6输出:7
输入:{5},5输出:5
解答 & 代码

节点 pNode 的中序遍历的下一个结点有 3 种可能:
- 若
pNode有右子树,则其中序遍历的下一个节点为其右子树的最左节点。eg. 上图 2 的中序遍历的下一个结点为 8 若
pNode没有右子树- 若
pNode是其父节点的左孩子,则pNode的父节点就是pNode中序遍历的下一个结点。eg. 上图 7 的中序遍历的下一个结点为 4 若
pNode是其父节点的有孩子,则沿着父节点往上,直到找到一个节点的父节点的左孩子是该节点,则该节点的父节点就是pNode中序遍历的下一个结点。eg. 上图 9 的中序遍历的下一个结点为 1/*struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}};*/class Solution {public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(pNode == nullptr)return nullptr;// 1. 若 pNode 有右子树,则其中序遍历的下一个节点为其右子树的最左节点if(pNode->right != nullptr){TreeLinkNode* next = pNode->right;while(next->left != nullptr)next = next->left;return next;}// 2. 若 pNode 没有右子树// 2.1 若 pNode 是其父节点的左孩子,则 pNode 的父节点就是 pNode 中序遍历的下一个结点else if(pNode->next != nullptr && pNode->next->left == pNode)return pNode->next;// 2.2 若 pNode 是其父节点的有孩子,则沿着父节点往上,直到找到一个节点的父节点的左孩子// 是该节点,则该节点的父节点就是 pNode 中序遍历的下一个结点else if(pNode->next != nullptr && pNode->next->right == pNode){TreeLinkNode* next = pNode->next;while(next->next != nullptr && next->next->left != next)next = next->next;return next->next;}elsereturn nullptr;}};
复杂度分析:设二叉树节点数为 N
- 若
- 时间复杂度 O(log N):即二叉树的深度
- 空间复杂度 O(1):
执行结果:
执行结果:通过执行用时:5 ms内存消耗:540 KB
