题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点? 树中的节点除了有两个分别指向左右子节点的指针,还有一个指向父节点的指针。
思路
总共有三种情况
- 1.如果一个节点没有右子树
- 1)判断当前节点是否是父节点的左子节点
- 如果是,那么下一个节点就是父节点,直接返回父节点
- 比如d的下一个节点就是b
- 2)即没有右子树,并且还是父节点的右子节点
- 沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的结点。
- 如果这样的结点存在,那么这个节点的父节点就是我们要找的下一个节点。
- 如果找不到那么就说明当前节点没有下一个节点。
- 节点i的下一个节点是a,节点g没有下一个节点
- 沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的结点。
- 1)判断当前节点是否是父节点的左子节点
- 2.如果一个节点有右子树
- 那么他的下一个节点就是右子树中的最左子节点。
- a的下一个节点就是f
class Solution {
static treeNode pNext;
public static TreeNode GetNext(TreeNode pNode) {
if(pNode == null) return null;
//如果当前节点有右子树,下一个节点就是右子树中的最左节点 2的条件
if(pNode.right != null) {
TreeNode pRight = pNode.right;
while(pRight.left != null) {
pRight = pRight.left;
}
pNext = pRight;
}else if(pNode.parent != null) {//当前节点没有右子树,并且父节点不为空
TreeNode pCurrent = pNode; //当前节点
TreeNode pParent = pNode.parent; //当前节点的父节点
while (pParent != null && pCurrent == pParent.right) {//1.2的条件
pCurrent = pParent;
pParent = pParent.parent;
}
pNext = pParent;
}
return pNext;
}
}