算法系列-第二十六题

14 阅读1分钟

题目名称:二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]


/**

* 解法一:递归

* 思路:略

* 时间复杂度: O(n),其中n为二叉树的节点数,遍历二叉树所有节点

* 空间复杂度: O(n),最坏情况下二叉树化为链表,递归栈深度为n

*/

function inorderTraversal(root: TreeNode | null): number[] {

const resArr: number[] = [];

if (root == null) return resArr;

inOrder(root, resArr);

return resArr;

}

function inOrder(node: TreeNode, resArr: number[]) {

if (node == null) return;

inOrder(node.left, resArr);

resArr.push(node.val);

inOrder(node.right, resArr);

}


/**

* 解法二:非递归

* 思路:

* (1)准备辅助栈,当二叉树节点为空了且栈中没有节点了,我们就停止访问。

* (2)从根节点开始,每次优先进入每棵的子树的最左边一个节点,我们将其不断加入栈中,用来保存父问题。

* (3)到达最左后,可以开始访问,如果它还有右节点,则将右边也加入栈中,之后右子树的访问也是优先到最左。

* 时间复杂度: O(n),其中n为二叉树的节点数,遍历二叉树所有节点

* 空间复杂度: O(n),辅助栈空间最大为链表所有节点数

*/

function inorderTraversal(root: TreeNode | null): number[] {

const resArr: number[] = [];

if (root == null) return resArr;

inOrder(root, resArr);

return resArr;

}

function inOrder(root: TreeNode, resArr: number[]) {

let node: TreeNode = root;

const stack: TreeNode[] = [];

while (stack.length || node) {

while (node) {

stack.push(node);

node = node.left;

}

const top = stack.pop();

resArr.push(top.val);

node = top.right;

}

}