题目摘至:《剑指Offer名企面试精讲典型编程题》
给定一棵二叉树和其中一个节点,如何找出中序遍历序列的下一个节点?书中的节点除了有两个分别指向左
右节点的指针,还有一个指向父节点的指针。
中序遍历的顺序为:左-根-右
如图所示的二叉树中:
- 如果一个节点有右子树,那么它的下一个节点就是它的右子树的最左子节点。如中序遍历到节点A的下一个节点时,发现节点A有右子树,右子树的最左边子节点就是F,那么下一个节点就是F;如中序遍历的节点是B那么同理它的下一步就是D。
- 如果一个节点没有右子树同时他又是父节点的左子树,那么中序遍历的下一步就是它的父节点。如D的父节点就是C,F的父节点就是E。
- 如果一个节点没有右子树并且是父节点的右子节点,那么中序遍历的下一步就是找到它的父节点到为父父节点的左节点为止,父父节点就是下一步遍历的节点。如G为C的右子树且没有右子树,那么它向上找找到C为B的右子节点,继续向上找找到B为A的左子节点,那么A就是G的下一步遍历节点了。
Java代码的实现
class MyBinaryTree{
private int value;
private MyBinaryTree leftNode;
private MyBinaryTree rightNode;
private MyBinaryTree parentNode;
public MyBinaryTree(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public MyBinaryTree getLeftNode() {
return leftNode;
}
public void setLeftNode(MyBinaryTree leftNode) {
this.leftNode = leftNode;
}
public MyBinaryTree getRightNode() {
return rightNode;
}
public void setRightNode(MyBinaryTree rightNode) {
this.rightNode = rightNode;
}
public MyBinaryTree getParentNode() {
return parentNode;
}
public void setParentNode(MyBinaryTree parentNode) {
this.parentNode = parentNode;
}
public static MyBinaryTree getNext(MyBinaryTree binaryTree){
if(binaryTree == null)
return null;
//1、如果某节点的右子节点不为空,那么中序遍历的下一个节点应该是该节点的右子树的最左节点
if(binaryTree.getRightNode() != null){
MyBinaryTree tempBinaryTree = binaryTree.getRightNode();
while(tempBinaryTree.getLeftNode() != null){
tempBinaryTree = tempBinaryTree.getLeftNode();
}
//最终的tempBinaryTree要么是右子树的最左节点,要么就是右子节点
return tempBinaryTree;
//2、如果某节点没有右子节点并且它是父节点的右子节点,那么它的下一个中序遍历节点一直查询它的父节点直到父节点为父父节点的
//左子节点那么该父父节点就是下一个节点了
}else if(binaryTree.getParentNode() != null && binaryTree == binaryTree.getParentNode().getRightNode()){
MyBinaryTree parentBinaryTree = binaryTree.getParentNode();
while(parentBinaryTree != parentBinaryTree.getParentNode().getLeftNode()){
parentBinaryTree = parentBinaryTree.getParentNode();
}
return parentBinaryTree.getParentNode();
//3、如果某节点没有右子节点并且是父节点的左子节点,那么下一个节点就是它的父节点
}else if(binaryTree.getParentNode() != null && binaryTree == binaryTree.getLeftNode()){
return binaryTree.getParentNode();
}else{
return null;
}
}
}