二叉树的下一个节点
题目:
给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。
注意:
- 如果给定的节点是中序遍历序列的最后一个,则返回空节点;
- 二叉树一定不为空,且给定的节点一定不是空节点;
题目分析:
二叉树的下一个节点为中序遍历序列结果的下一个元素
中序遍历顺序为先访问左子树,然后根结点,最后访问右子树
结点左右子树的情况不同,它的后继也不一样
可分多种情况讨论
情况1:节点有右儿子且右儿子有左儿子,则结果为右儿子的最左结点,否则为右儿子
如F,它的右儿子是E,E的最左结点为H,返回H
如E,它的右儿子是G,G没有左儿子,返回G
情况二:节点没有右儿子
则需要回溯father节点,找到第一个father节点是father节点的father的左子树,返回其father即可
代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode *father; * TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {} * }; */ class Solution { public: TreeNode* inorderSuccessor(TreeNode* p) { //右结点存在 if(p->right){ p = p->right; while(p && p->left) p = p->left; return p; } //右结点不存在并是父结点的右儿子 while(p->father && p == p->father->right) p = p->father; //右结点不存在并且不是父结点的右儿子 return p->father; } };