TypeScript算法-94.二叉树的中序遍历(递归和非递归写法)

TypeScript算法-94.二叉树的中序遍历

  • 思路
  • 解法一
  • 解法二

思路

哇好久没接触树了,有些陌生了。但还记得先序,中序和后序都是指root的遍历位置,中序就是先遍历左子树,然后当前节点,然后遍历右子树。

翻了翻自己以前写的博客,《没啥说的》,各种遍历记载的挺好。

解法一

递归法,注意递归的终止条件,然后要将遍历的结果放在全局:

type TNode = TreeNode | null;

/** Definition for a binary tree node. */
class TreeNode {
    val: number;
    left: TNode;
    right: TNode;
    constructor(val?: number, left?: TNode, right?: TNode) {
        this.val = val !== undefined ? val : 0;
        this.left = left !== undefined ? left: null;
        this.right = right !== undefined ? right: null;
    }
}



function inorderTraversal(root: TreeNode | null): number[] {
    const res: number[] = [];

    function inOrder(root: TreeNode | null): void {
        if (root === null) return
        inOrder(root.left);
        res.push(root.val);
        inOrder(root.right);
    }

    inOrder(root);
    return res;
}


const root = new TreeNode(2);
root.left = new TreeNode(3);
root.right = null;
console.log(inorderTraversal(root));

解法二

迭代法,用栈模拟这个过程,TODO,记得陈越姥姥的数据结构这几种用迭代法怎么做讲的特别清楚,可以再看下当时的博客。

function inorderTraversal_stack(root: TNode): number[] {
    const res: number[] = [];

    function inOrder_stack(root: TNode): void {
        let temp: TNode = root;
        const s: TreeNode[] = [];
        while(temp !== null || s.length) {
            while(temp !== null) {
                s.push(temp); // 第一次遇到先压栈
                temp = temp.left;  // 继续向左遍历
            }
            // 左子树遍历完成
            if (s.length) {
                temp = s.pop()!;
                res.push(temp.val);  // 第二次遇到,中序遍历
                temp = temp.right;  // 继续向右遍历
            }
        }
    }

    inOrder_stack(root);
    return res;
}

你可能感兴趣的:(TS算法练习,typescript,树)