Morris遍历
解决问题:在不使用栈不使用递归的情况下对二叉树按照先中后续方法进行遍历,空间复杂度为O(1),时间复杂度为O(n).
解决问题思路
1.初始化当前节点为current.
2.当前节点不为空:
(1)当前节点没有左孩子,currrent=current->right
(2)当前节点有左孩子,找到当前左子树的最右节点mostRight:
(a)如果最右节点的右孩子不是当前节点,那么mostRight的右孩子指向current,current向左移动.
(b)否则current向右移动,mostRight的右孩子置为null.
根据需要的遍历顺序在不同的时机打印节点,后续遍历时需要返回转列表进行遍历.
实现代码
class Morris
{
/**
* @param $node BinaryTree
*/
public function traversal($node)
{
$current = $node;
while ($current != null) {
if ($current->leftNode == null) {
echo "$current->value ";
$current = $current->rightNode;
} else {
$mostRight = $this->findMostRight($current->leftNode, $current);
if ($mostRight->rightNode == $current) {
echo "$current->value ";
$mostRight->rightNode = null;
$current = $current->rightNode;
} else {
$mostRight->rightNode = $current;
$current = $current->leftNode;
}
}
}
}
/**
* @param $node BinaryTree
* @param $current BinaryTree
* @return BinaryTree
*/
public function findMostRight($node, $current)
{
while ($node->rightNode != null && $node->rightNode != $current) {
$node = $node->rightNode;
}
return $node;
}
}