题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针
思路:中序遍历的顺序是先访问左子节点再访问父亲节点再访问右子节点,而本题是为了获取中序遍历的下一个节点,所以必须需要考虑到右子节点的情况
- 当该节点的右子节点不为空时,为了获取该节点的中序遍历的下一个节点,就必须去右子节点查找
当右子节点存在左子树的时候,就需要遍历到它的左子树,直到某个节点的左子节点为空
如果不存在左子树,则直接将右子节点返回 - 当该节点的右子节点为空时,这种情况比较复杂
如果该节点是父节点,那么它的右子节点为空,中序遍历的下一个节点也为空
如果该节点不是父节点,并且它是它父节点的左子节点,那么该节点的中序遍历的下一个节点为它的父节点
如果该节点不是父节点,并且它是它父节点的右子节点,该节点的中序遍历的下一个节点是第一个以它的父节点(祖爷)为左节点的节点.
/*
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)
{
// 如果当前节点等于Null
if(pNode==null){
return null;
}
TreeLinkNode curNode = pNode;
// 右子树为空
if(curNode.right!=null){
curNode = curNode.right;
//左子树不为空,遍历左子树
while(curNode.left!=null){
curNode = curNode.left;
}
return curNode;
}
// 右子树为空
if(curNode.right==null){
// 当前节点为根节点直接返回curNode.next;(null)
// 当前节不是根节点,并且该节点等于该为其父节点的左子节点
if(curNode.next==null||curNode==curNode.next.left){
return curNode.next;
}
// 如果该节点不是父节点,并且它是它父节点的右子节点,该节点的中序遍历的下一个节点是第一个以它的父节点(祖爷)为左节点的节点
while(curNode.next!=null&&curNode.next.left!=curNode){
curNode = curNode.next;
}
return curNode.next;
}
return null;
}
}
1216

被折叠的 条评论
为什么被折叠?



