以力扣的题为例
题目:给你二叉树的根节点 root
,返回它节点值的 前序 遍历。
1 2
| 输入:root = [1,null,2,3] 输出:[1,2,3]
|
一:二叉树的递归遍历
前序递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
var preorderTraversal = function(root, res = []) { if(!root) return res res.push(root.val) preorderTraversal(root.left, res) preorderTraversal(root.right, res) return res };
|
中序递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
var preorderTraversal = function(root, res = []) { if(!root) return res inorderTraversal(root.left, res) res.push(root.val) inorderTraversal(root.right, res) return res };
|
后序递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
var postorderTraversal = function(root, res = []) { if(!root) return res postorderTraversal(root.left, res) postorderTraversal(root.right, res) res.push(root.val) return res };
|
二:二叉树的迭代遍历
前序的迭代遍历
递归的迭代遍历理论上都是可以用栈来模拟的
前序遍历 即中左右,需要注意的是,由于栈的数据结构先进后出,所以入栈顺序应为 右 左
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var preorderTraversal = function(root, res = []) { if(!root) return res const stack = [] stack.push(root) let node = null while(stack.length){ node = stack.pop() res.push(node.val) if(node.right) stack.push(node.right) if(node.left) stack.push(node.left) } return res };
|
后序的迭代遍历
后序的迭代遍历和前序很类似
访问的节点都是为当前需要处理的节点
只需要将前序的入栈顺序颠倒一下,最后将数组反转一下即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var postorderTraversal = function(root, res = []) { if(!root) return res const stack = [] stack.push(root) let node = null while(stack.length){ node = stack.pop() res.push(node.val) if(node.left) stack.push(node.left) if(node.right) stack.push(node.right) } return res.reverse() };
|
中序的迭代遍历
中序遍历的迭代遍历跟前序后序的迭代遍历有所不同
由于中序的访问节点和当前要处理的节点不是一个节点,所以需要用指针来进行处理
中序 – 左 中 右
入栈顺序 — 左 右
出栈顺序 — 左 中 右
即先遍历左子节点,访问到的左子节点加入栈中
若子节点为空,弹出栈顶元素
若右子节点为空,弹出栈顶元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| var inorderTraversal = function(root, res = []) {
if(!root) return res const stack = [] let cur = root while(cur || stack.length){ if(cur){ stack.push(cur) cur = cur.left }else{ cur = stack.pop() res.push(cur.val) cur = cur.right } } return res };
|
三:二叉树的层序遍历
层序遍历,即每层输出元素。
利用队列去实现,类似于广度优先搜索。
将每层的元素放入队列中,同时记录下每层元素的个数
出队的同时,判断是否有子节点,如果有将其入队
这个时候就会遇到例如第二层第三层元素在同一队列,那么当时记录下的元素个数size就起作用了
每次出队的同时,size–,来控制将队列中的该层元素对应出队成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| var levelOrder = function(root) { let queue = [] let res = [] if(!root) return res queue.push(root) while(queue.length !== 0){ let length = queue.length let curLevel = [] for(let i = 0; i < length; i++){ let node = queue.shift() curLevel.push(node.val) if(node.left) queue.push(node.left) if(node.right) queue.push(node.right) } res.push(curLevel) } return res
};
|