题目:三颗满二叉树,他们的根节点互为父节点,从任意节点遍历整颗二叉树
要求:不能使用外部变量、集合等
不能改变树结构
不能 给节点添加额外属性
ps: 屁事真多
思路:一颗没毛病,就前序遍历就OK, 三颗也一样,但是要考虑到遍历根节点时死循环问题,方式为:如果一个节点是根节点,则设置标识, 并且只记录第一次碰到的的根节点, 还有一点,递归时要传过去当前节点,防止重复遍历
- 打印
- 遍历头
- 遍历左孩子
- 遍历右孩子
java
static class Node<E> {
E v;
Node<E> left;
Node<E> right;
Node<E> head;
public Node(E v) {
this.v = v;
}
}
/**
* @param node
* @param sourceNode 遍历到node节点的节点
* @param firstRootNode 第一次碰到的根节点
*/
private static void threeTreeTraversal(Node<Integer> node, Node<Integer> sourceNode, Node<Integer> firstRootNode) {
if (null == node) {
return;
}
// 先打印本节点值
System.out.print(node.v + " ");
// 如果一个节点是根节点,则设置标识,方式root节点之间死循环, 并且只记录第一次的根节点
if (isRoot(node) && null == firstRootNode) {
firstRootNode = node;
}
if (node.head != sourceNode && node.head != firstRootNode) {
// 遍历头节点
threeTreeTraversal(node.head, node, firstRootNode);
}
if (node.left != sourceNode) {
// 遍历左子树
threeTreeTraversal(node.left, node, firstRootNode);
}
if (node.right != sourceNode) {
// 遍历右子树
threeTreeTraversal(node.right, node, firstRootNode);
}
}
public static boolean isRoot(Node<Integer> node) {
Node<Integer> parent = node.head;
if (parent.left == node || parent.right == node) {
return false;
}
return true;
}