1、题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2、思想
当前结点有右子树:
下一个节点是右子树的最左节点。
当前结点没有右子树:
(1)当前结点是父节点的左子节点,下一个节点是父节点。
(2)当前结点是父节点的右子节点,上溯到第一个左子节点,下一个节点是第一个左子节点的父节点。
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
;
}
TreeLinkNode pNext =
null
;
//二叉树中给定节点的下一个节点
if
(pNode.right !=
null
){
//给定节点有右子树
TreeLinkNode right = pNode.right;
while
(right.left !=
null
){
//下一个节点是右结点的最左子节点
right = right.left;
}
pNext = right;
}
else
if
(pNode.next !=
null
){
//给定节点没有右子树,但是给定节点的父节点不为空
TreeLinkNode current = pNode;
TreeLinkNode parent = pNode.next;
while
(parent!=
null
&& current==parent.right){
//当前节点是父节点的右结点,沿着指向父节点的指针一直向上遍历,
//知道找到一个是它父节点的左子节点的节点,如果这样的节点存在,
//那么这个节点的父节点就是我们要找的下一个节点。
current = parent;
parent = parent.next;
}
pNext = parent;
//当前结点是它父节点的左子节点,则这个节点的父节点就是我们要找的下一个节点
}
return
pNext;
//返回当前结点的下一个节点
}
}
|