活动地址:CSDN21天学习挑战赛
*大学期间自认为数据结构学的还不错 奈何时间真是个好东西 看我不用就全给我收回去了 最近要准备找工作了 大厂笔试题貌似很偏爱二叉树 最近趁着活动 强迫自己来回顾总结一下吧 *
…
关于递归
首先需要确定下来递归算法的三个要素。每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!
**
1,确定递归函数的参数和返回值
确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
2,确定终止条件
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
3,确定单层递归的逻辑
确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
**
举例说明(前序)
144. 二叉树的前序遍历
**
1,确定递归函数的参数和返回值
因为讲当前节点的 left 或 right 进行递归 ,所以参数里需要传入 node ,代码如下:
const traversal = (node) => {
...
}
2,确定终止条件
在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return,代码如下:
if(!node) return res
3,确定单层递归的逻辑
前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:
res.push(node.val)
traversal(node.left)
traversal(node.right)
单层递归的逻辑就是按照中左右的顺序来处理的,这样二叉树的前序遍历,基本就写完了,再看一下完整代码:
/**
* 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) {
let res = []
const traversal = (node) => {
if(!node) return res;
res.push(node.val)
traversal(node.left)
traversal(node.right)
}
traversal(root, res)
return res
};
**
那么前序遍历写出来之后,中序和后序遍历就不难理解了,代码如下:
中序遍历:
/**
* 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 inorderTraversal = function(root) {
let res = []
const traversal = (node) => {
if(!node) return res;
traversal(node.left);
res.push(node.val);
traversal(node.right);
}
traversal(root)
return res;
};
后序遍历:
/**
* 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 postorderTraversal = function(root) {
let res = []
const traversal = (node) => {
if(!node) return res;
traversal(node.left);
traversal(node.right);
res.push(node.val);
}
traversal(root);
return res;
};