1.题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2.解题思路
情况1:该节点有右子树:
6 / \ 3 10 / \ / \ 2 5 8 12
中序遍历结果为:2–>3–>5–>6–>8–>10–>12
即它的下一个结点就是它的右子树中最左子结点
情况2.1:该节点无右子树:(为父节点6的左子节点)
6 / \ 3 10 / / \ 2 8 12
2–>3–>6–>8–>10–>12
该节点是父节点的左子节点的这种情况比较简单,直接将父节点返回即可
情况2.2:该节点无右子树:(为父节点6的右子节点)
6 / \ 3 10 / \ / \ 2 5 8 null
2–>3–>6–>8–>10 -->null
如果是父节点的右子节点的话,需要不断的向上移动,直到对应的节点不是父节点的右节点(即左节点),既然他是父节点的左节点,此时将这个节点父节点返回即可,或者遍历到了根节点,返回null;
3.代码
/*
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){
pNode = pNode.right;
while(pNode.left != null){
pNode = pNode.left;
}
return pNode;
}
//该节点无右子树,父节点不为空
while(pNode.next != null){
//pNode为父节点的左节点为该节点,直接返回父节点
if(pNode.next.left== pNode){
return pNode.next;
}
//为父节点的右子节点,不断的向上移动,直到对应的节点不是父节点的左子节点
//一直回溯如果遍历到他是父节点的左节点,此时将这个节点父节点返回即可,
//或者遍历到了根节点,返回null;
pNode = pNode.next;
}
return null;
}
}