牛客网原题目链接:二叉树的下一个结点。
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
对于一个给定的二叉树,题目要求中序遍历,中序遍历的顺序是先中序遍历左子树,再根节点,最后中序遍历右子树。
所以可以使用中序遍历得到整个二叉树的遍历序列,然后再找该节点的下一个值;但是题目要求找的是一个结点,而不是值;所以此法不行。
那么根据中序遍历的特点来分析:
由于遍历顺序是先左子树,再根,最后右子树;要找的结点就相当于是根结点,那么他的下一个节点就应在其右子树。
那么就应该讨论该结点是否有右结点:
如果有,那就应该采用此方法遍历其右子树;结果就是其右节点的最左边的结点,或者就是其右节点。
如果没有,那就要判断该结点是其父结点的左结点还是右结点;
如果是其父的左结点,那下一个就是其父节点;
否则,就是其父结点的父结点,直到是某个父结点的左结点,下一个就是那个父结点。
实现代码如下:
1 public TreeLinkNode GetNext(TreeLinkNode pNode) 2 { 3 if(pNode == null){ 4 return null; 5 } 6 //判断是否有右结点 7 if(pNode.right != null){ 8 pNode = pNode.right; 9 //寻找该结点最左边的结点 10 while (pNode.left != null){ 11 pNode = pNode.left; 12 } 13 return pNode; 14 } 15 //若没有右结点,就找该结点的父结点 16 while(pNode.next != null){ 17 TreeLinkNode root = pNode.next; //定义一个结点作为当前节点的父结点 18 if(root.left == pNode){ //若当前结点是其父结点的左结点,下一个结点就是此父节点 19 return root; 20 } 21 pNode = pNode.next; //否则就继续找其父节点 22 } 23 return null; //若最终找不到,则没有下一个结点 24 }