一、查询后继节点
后继节点:中序遍历时,某个节点的后一个节点即是该节点的后继节点。
规定二叉树的结构如下:
public static class Node {
public int value;
public Node left;
public Node right;
// 父节点
public Node parent;
public Node (int v) {
value = https://www.it610.com/article/v;
}
}
/**
* 查找后继节点
*
* @author Java和算法学习:周一
*/
public static Node successorNode(Node node) {
if (node == null) {
return null;
}// 有右孩子
if (node.right != null) {
// 找到右树上最左的孩子
return getMaxLeft(node.right);
} else {
// 无右孩子
// 根据parent指针往上找
Node parent = node.parent;
// 没有找到最顶上,且当前节点是父节点的右孩子则一直往上找
while (parent != null && parent.right == node) {
node = parent;
parent = node.parent;
}
// parent包含两种情况
// 1)找到最顶上了,即parent是null
// 2)找到某个节点是父节点的左孩子了
return parent;
}
}/**
* 得到某个节点最左的孩子
*/
private static Node getMaxLeft(Node right) {
if (right == null) {
return null;
}
while (right.left != null) {
right = right.left;
}
return right;
}
/**
* @author Java和算法学习:周一
*/
public static void paperFolding(int n) {
// 二叉树头节点是凹的
process(1, n, true);
}/**
* @param i 节点的层数
* @param n 一共多少层
* @param down true=凹,false=凸
*/
private static void process(int i, int n, boolean down) {
if (i > n) {
return;
}// 上边是凹
process(i + 1, n, true);
System.out.print(down ? "凹 " : "凸 ");
// 下边是凸
process(i + 1, n, false);
}