题目
给定一种新的二叉树节点如下:
1 | public static class Node { |
该结构比普通二叉树节点多了一个指向父节点的parent指针。
假设用这种节点组成的二叉树,树中每个节点的parent都正确地指向自己的父节点(头节点的parent指向null)。
现在给定某个节点node,请实现返回node的后继节点的函数。
- 前驱节点和后继节点的概念
思路
拿到题目我们应该观察一下数据状况,中序遍历的特点是什么?
- 以某一节点作为根,应先先遍历并输出其左子树(包括子孙那些),再输出自身,最后遍历并输出其右子树(包括子孙那些)。
简单来说就是左中右
- 前驱和后继的是十分相似的,这里我们提供后继的思路,前驱的思路作为练习自行完成。(后面代码前驱后继都有,可以对照一下)
后继节点
我们可以把目标节点分成两种情况
- 若当前节点拥有右子树,则其右子树最左的节点为前驱节点,因为中序遍历左中右,你当前作为中,你的后继节点必然是右(右的最左先哦)。
- 若当前节点没有右子树,那就把你自己当作是某棵子树的最右部分,寻找是哪一代先辈把你所在的子树作为左子树(也就是找哪个节点把目标节点作为左子树的最右的节点)
文字描述可能比较抽象,下面看下具体的代码实现。
实现
后继节点
1 | public static Node getSuccessorNode(Node node) { |
前驱节点
1 | public static Node getPredecessor(Node node) { |
测试方法
1 | //中序遍历:4,2,5,1,6,3,7 |