给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 如果给定的节点有右子树,那么它的右子树的最左节点就是下一个节点,例如 a 的下一个节点为 f ;b 的下一个节点为 h
- 如果给定的节点没有右子树
- 如果该节点是其父节点的左子节点,那么下一个节点为父节点,例如:f 的下一个节点为 c ;d 的下一个节点为 b
- 如果该节点是其父节点的右子节点,那么需要一直往上遍历,找到一个节点是其父节点的左子节点,这个父节点是下一个节点,例如:i 的下一个节点为 a
- 遍历到根节点都没有找到符合条件的节点,就是没有没有下一个节点
第一个测试:dbheiafcg
第二个测试:DCBA
第三个测试:aa bb cc dd
package offer.tree;
public class NextNode {
public static class TreeLinkNode {
String val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode parent = null;
TreeLinkNode(String val) {
this.val = val;
}
}
public static TreeLinkNode GetNext(TreeLinkNode node) {
if(node == null){
return null;
}
//有右子树,找左子树的最左节点
if(node.right != null){
TreeLinkNode temp = node.right;
while(temp.left != null){
temp = temp.left;
}
return temp;
}else{
//没有右子树,一直往上找,找到父节点的左节点是自身的节点
TreeLinkNode parent = node.parent;
TreeLinkNode temp = node;
while(parent != null && parent.left != temp){
temp = temp.parent;
parent = temp.parent;
}
return parent;
}
}
//test
public static void main(String[] args){
//第一个测试
TreeLinkNode a = new TreeLinkNode("a");
TreeLinkNode b = new TreeLinkNode("b");
TreeLinkNode c = new TreeLinkNode("c");
TreeLinkNode d = new TreeLinkNode("d");
TreeLinkNode e = new TreeLinkNode("e");
TreeLinkNode f = new TreeLinkNode("f");
TreeLinkNode g = new TreeLinkNode("g");
TreeLinkNode h = new TreeLinkNode("h");
TreeLinkNode i = new TreeLinkNode("i");
a.left = b;
a.right = c;
a.parent = null;
b.left = d;
b.right = e;
b.parent = a;
c.left = f;
c.right = g;
c.parent = a;
d.left = null;
d.right = null;
d.parent = b;
e.left = h;
e.right = i;
e.parent = b;
f.left = null;
f.right = null;
f.parent = c;
g.left = null;
g.right = null;
g.parent = c;
h.right = null;
h.left = null;
h.parent = e;
i.left = null;
i.right = null;
i.parent = e;
System.out.println( GetNext(a).val);
System.out.println( GetNext(b).val);
System.out.println( GetNext(c).val);
System.out.println( GetNext(d).val);
System.out.println( GetNext(e).val);
System.out.println( GetNext(f).val);
System.out.println( GetNext(g));
System.out.println( GetNext(h).val);
System.out.println( GetNext(i).val);
System.out.println("==========");
//第二个测试
TreeLinkNode A = new TreeLinkNode("A");
TreeLinkNode B = new TreeLinkNode("B");
TreeLinkNode C = new TreeLinkNode("C");
TreeLinkNode D = new TreeLinkNode("D");
A.left = B;
A.parent = null;
A.right = null;
B.left = C;
B.parent = A;
B.right = null;
C.left = D;
C.parent = B;
C.right = null;
D.left = null;
D.parent = C;
D.right = null;
System.out.println(GetNext(A));
System.out.println(GetNext(B).val);
System.out.println(GetNext(C).val);
System.out.println(GetNext(D).val);
System.out.println("==========");
//第三个测试
TreeLinkNode aa = new TreeLinkNode("aa");
TreeLinkNode bb = new TreeLinkNode("bb");
TreeLinkNode cc = new TreeLinkNode("cc");
TreeLinkNode dd = new TreeLinkNode("dd");
aa.parent = null;
aa.right = bb;
aa.left = null;
bb.parent = aa;
bb.right = cc;
bb.left = null;
cc.parent = bb;
cc.right = dd;
cc.left = null;
dd.parent = cc;
dd.right = null;
dd.left = null;
System.out.println(GetNext(aa).val);
System.out.println(GetNext(bb).val);
System.out.println(GetNext(cc).val);
System.out.println(GetNext(dd));
}
}