二叉树的前序遍历
什么是二叉树前序遍历

前序遍历:1 2 4 5 7 8 3 6
前序遍历:根结点 —> 左子树 —> 右子树
前序遍历:
是二叉树遍历的一种, 也叫做 先根遍历 、先序遍历、前序周游,可记做根左右。前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树 。
需要注意的是:遍历左右子树时仍然采用前序遍历方法。
如上图所示二叉树
前序遍历结果:12457836
题目: 二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。
示例 1:
输入: [1, null, 2, 3];
1
\
2
/
3;
输出: [1, 2, 3];
答案
递归解题法: preOrder 函数将根节点 root 的val值加入数组,然后递归调用自身 获取left 跟 right 的 val值 , 递归止于 节点为null的时候。
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function (root) {
const res = [];
const preOrder = root => {
if (root == null) return;
res.push(root.val);
preOrder(root.left);
preOrder(root.right);
};
preOrder(root);
return res;
};
const root = {
val: 1,
left: null,
right: {
val: 2,
left: { val: 3, left: null, right: null },
right: null,
},
};
const res = preorderTraversal(root);
迭代解题法:
维护一个栈 stack,模拟递归的压栈出栈。
遍历 获取 val 值 ,把 right 节点 压入 stack 栈内 , 把 left 节点 赋值 给 根节点 root
进入第二次遍历,判断栈 stack 是否有值,如果有 把 栈内的数据 pop 出来,赋值 给 root,并获取 root 的 val,
把 left 节点 赋值 给 root ,进入第三次遍历, 重复 第一次 遍历所做的事情
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function (root) {
const res = [];
let stack = [];
while (root) {
res.push(root.val);
if (root.right) stack.push(root.right);
root = root.left;
}
while (stack.length) {
root = stack.pop();
res.push(root.val);
if (root.right) stack.push(root.right);
root = root.left;
while (root) {
res.push(root.val);
if (root.right) stack.push(root.right);
root = root.left;
}
}
return res;
};
const root = {
val: 1,
left: null,
right: {
val: 2,
left: { val: 3, left: null, right: null },
right: null,
},
};
const res = preorderTraversal(root);
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!