题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
此图来自https://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e?f=discussion
程序:
/*
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 pNode;
}
//如果右节点存在,那么此节点不管是在哪个位置,下一个节点肯定是右节点或者右节点的左孩子的左孩子
if(pNode.right!=null) {
pNode = pNode.right;
if(pNode.left!=null) {
while(pNode.left!=null) {
pNode = pNode.left;
}
return pNode;
}else {
return pNode;
}
}
//这是没有右节点的情况,那就要确定父节点了
//如果此节点是根节点,那后面就是null
//如果此节点不是根节点,
//1、那此节点是父节点的左节点的话那此节点中序下一个节点就是父节点
//2、如果是右节点,就继续往父节点的父节点找,找到一个父节点的左节点是它的父节点,如果到了根节点还不是,那说明此节点后面的节点是null
if(pNode.right==null&&pNode.next!=null) {
int val = pNode.val;
pNode = pNode.next;
while(pNode!=null) {
if(pNode.left!=null&&pNode.left.val==val) {
return pNode;
}else {
val = pNode.val;
pNode = pNode.next;
}
}
}
return null;
}
}
这里需要注意的也是一种警告:
在任何二叉树或者其他题里一定要经常考虑它是否存在,防止它对象为空的产生,
就以上面的程序举一个例子
if(pNode.left!=null&&pNode.left.val==val) {}
这里面如果没有pNode.left!=null
那就会报错,因为你不知道这里有没有left节点,如果没有你再.val
肯定报错