题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
参考:https://www.nowcoder.com/profile/327191
思路
基于二叉树的中序遍历有以下规则:
1. 如果该节点有右子树 则右子树最左边的节点就是该节点的下一个节点
2. 如果该节点没有右子树,则找该节点 = 它父节点的左孩子 的那个节点就是下个节点,如果向上的父节点仍然不满足,则继续向上 根据“该节点 = 它父节点的左孩子” 规则寻找。
例如参考上树: 中序遍历 为 (4,7,2,1,5,3,8,6) 结合以下代码 分析
/*
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){
if(pNode == pNode.next.left){
return pNode.next;
}
pNode = pNode.next; //继续向上找父节点的左孩子 = 当前节点
}
return null;// 向上找到根节点了还没有找到 则返回null
}
}