问题描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
实现
方法:
- 右子树存在
- 右子树不存在
- 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点。例如,寻找b的下一个节点的过程(b有右子节点e,e的左子节点是h,且h是e的最左节点,h是b的下一个节点)
- 如果节点无右子节点,但该节点是父节点的左子节点,则父节点是该节点的下一个节点。例如,寻找d的下一个节点的过程(d无右子节点,d是父节点b的左子节点,则b是de的下一个节点)
- 如果节点无右子节点,且该节点是父节点的右子节点,则沿着父节点的指针向上遍历。例如,寻找i的下一个节点的过程(i的父节点e,e是其父节点b的右子节点,节点b是其父节点a的左子节点,节点a是节点i的下一个节点)
/**8 二叉树的下一个节点*/
// 中序输出的下一个节点{d,b,h,e,i,a,f,c,g}
// a
// / \
// b c
// / \ / \
// d e f g
// / \
// h i
public class C08_tree_NextNode {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode next; // 父节点
TreeNode(int x) {
this.val = x;
}
}
TreeNode getNextNode(TreeNode root) {
if (root == null) return null;
if (root.right != null) { // 1.如果有右子树,下一个节点
root = root.right;
while (root.left != null) {// 找右子树的最左节点
root = root.left;
}
return root;
}
while (root.next != null) { // 2.没有右子树,找第一个当前节点 是父节点左孩子的 节点
if (root.next.left == root) { // 根的左节点为当前值
return root.next;
}
root = root.next; //后退
}
return null; //退到了根节点仍没找到,则返回null
}
}