题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针father。
该中序遍历为:d->b->h->e->i->a->f->c->g
解题思路
- 如果输入的 node 节点有右孩子
下一个结点就是以node结点的右子树中最左子节点。如b那么下一个节点就应该是h。 - 如果输入的node节点没有右孩子
- node节点是其父结点的左孩子,那么下一个节点就是node的父节点。如f的下一个节点为c
- node节点是父节点的右孩子,那么下一个节点就是往上找直到某个节点是他的父节点的左孩子,此时该节点的父节点就是node节点的下一个节点。如i的下一个节点就是a。
算法图解
参考代码:
package offer;
public class Offer8 {
public static void main(String[] args) {
// 1
// // \\
// 2 3
// // \\
// 4 5
// inorder->42513
TreeLinkNode root = new TreeLinkNode(1);
root.left = new TreeLinkNode(2);
root.left.father =root;
root.right = new TreeLinkNode(3);
root.right.father =root;
root.left.left = new TreeLinkNode(4);
root.left.left.father =root.left;
root.left.right = new TreeLinkNode(5);
root.left.right.father =root.left;
System.out.println(GetNext(root.left.right ).val);
}
public static TreeLinkNode GetNext(TreeLinkNode pNode) {
/*这里需要注意的是pNode.next是pNode结点的父结点
1、如果有右子树,那么下一个结点就是右子树最左边的节点。
2、如果没有右子树,分两种情况,如果该结点的为父结点的左孩子,则该结点的父节点pNode.next则为
该结点的下一个结点。
第二种情况则是如果该结点的为父节点的右孩子,则向上找父节点,直到父节点为该父节点的左孩子,则该父节点的父节点
为下一个结点。
*/
if (pNode == null) {
return null;
}
if (pNode.right != null) {//1、如果有右子树,那么下一个结点就是右子树最左边的节点。
pNode = pNode.right;
while (pNode.left != null) pNode = pNode.left;
return pNode;
}
while (pNode.father !=null) {//这个则是在没有右子树的情况下,求下一个结点。
if (pNode.father.left == pNode) {
return pNode.father;
}
pNode = pNode.father;
}
return pNode;
}
}
class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode father = null;
TreeLinkNode(int val) {
this.val = val;
}
}
附录
该题源码在我的 ?Github 上面!