题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
画图
有两种情况:当前结点有右子树和当前结点没有右子树
当前结点有右子树的情况:下一个结点就是右子树的最左结点
当前结点没有右子树的情况,分为两种:
(1)当前结点是左叶子结点,它的下一个结点是当前结点的父节点
(2)当前结点是右叶子结点a,a的下一个结点是:如果a的父节点是b的左结点,则b是a的下一个结点(b是a的父节点的父节点),如果不是,再继续向上找a的父节点的父节点...,如果没找到,则a是尾结点
代码:
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode){
if(pNode == null){
return null;
}
if(pNode.right != null){//当前结点有右子树
TreeLinkNode next_node = pNode.right;
while(next_node.left != null){
next_node = next_node.left;
}
return next_node;
}
while(pNode.next != null){//当前结点没有右子树
if(pNode.next.left == pNode){//如果当前结点是当前结点父节点的左结点,返回当前结点的父节点
return pNode.next;
}
pNode = pNode.next;
}
return null;
}
}