前序遍历
使用递归的方式,先遍历父节点,再遍历左节点,最后再遍历右节点
/**
* 二叉树的前序遍历
* @params {TreeNode} root
*/
function preOrder(root) {
if (!root) {
return
}
console.log(root.val);
preOrder(root.left);
preOrder(root.right);
}
中序遍历
使用递归的方式,先遍历左节点,再遍历父节点,最后再遍历右节点
/**
* 二叉树的中序遍历
* @params {TreeNode} root
*/
function inOrder(root) {
if (!root) {
return
}
inOrder(root.left);
console.log(root.val);
inOrder(root.right);
}
后序遍历
使用递归的方式,先遍历左节点,再遍历右节点,最后再遍历父节点
/**
* 二叉树的后序遍历
* @params {TreeNode} root
*/
function postOrder(root) {
if (!root) {
return
}
postOrder(root.left);
postOrder(root.right);
console.log(root.val);
}
Morris 遍历
Morris 是 O(1) 空间复杂度的二叉树遍历算法
Morris 中序遍历的一个重要步骤就是寻找当前节点的前驱节点,并且 Morris 中序遍历寻找下一个点始终是通过转移到 rightright 指针指向的位置来完成的。
- 如果当前节点没有左子树,则遍历这个点,然后跳转到当前节点的右子树。
- 如果当前节点有左子树,那么它的前驱节点一定在左子树上,我们可以在左子树上一直向右行走,找到当前点的前驱节点。
- 如果前驱节点没有右子树,就将前驱节点的 rightright 指针指向当前节点。这一步是为了在遍历完前驱节点后能找到前驱节点的后继,也就是当前节点。
- 如果前驱节点的右子树为当前节点,说明前驱节点已经被遍历过并被修改了 rightright 指针,这个时候我们重新将前驱的右孩子设置为空,遍历当前的点,然后跳转到当前节点的右子树。
```javascript
/**
- 二叉树的 Morris 遍历
- @params {TreeNode} root */ function morrisTravers() {
} ```