代码随想录 day14

1.理论基础

1.1 二叉树的种类

  • 满二叉树:叶子节点那一排全排满的树

  • 完全二叉树:除叶子节点外全排满的树,且叶子节点要是连续的
    代码随想录 day14_第1张图片

  • 二叉搜索树:头节点>左节点>右节点的树,中序遍历下来是一串递增的数值
    代码随想录 day14_第2张图片

  • 平衡二叉树:左子树和右子树的高度差的绝对值不能超过一
    代码随想录 day14_第3张图片

2.递归遍历

二叉树的遍历主要分为两种,分别是深度优先搜索和广度优先搜索,深度优先搜索仔细分还可以分为三种,即前序、中序、后序遍历,广度优先搜索即层序遍历,使用递归的方法实现前中后三种遍历的代码如下。

// 前序遍历
var travelsal = function(cur,vec){
	if(!cur)retrun;
	vec.push(cur.val);
	traversal(cur.left,vec);
	traversal(cur.right,vec);
}
// 中序遍历
var travelsal = function(cur,vec){
	if(!cur)retrun;
	traversal(cur.left,vec);
	vec.push(cur.val);
	traversal(cur.right,vec);
}
// 后序遍历
var travelsal = function(cur,vec){
	if(!cur)retrun;
	traversal(cur.left,vec);
	traversal(cur.right,vec);
	vec.push(cur.val);
}

3.迭代遍历

迭代遍历也就是非递归遍历,利用了栈实现,其实所有的递归都可以用栈进行模拟,实现代码如下:

// 前序遍历
var travelsal = function(root){
	let stack = [];
	let vec = [];
	while(stack.length){
		let cur = stack.pop();
		if(cur)vec.push(cur.val);
		else continue;
		stack.push(cur.right);
		stack.push(cur.left);
    }
    return vec;
}

前序遍历的顺序是中左右,可以将左右调换变成中右左,然后来个大翻转即可变成后续遍历的顺序左右中,具体实现代码如下:

// 后序遍历
var traversal = function(root){
	let stack = [];
	let vec = [];
	if(root)stacj.push(root)
	while(stack.length){
		let cur = stack.pop();
		if(cur)vec.push(cur.val);
		else continue;
		stack.push(cur.left);
		stack.push(cur.right);
	}
	return reverse(vec);
}

中序遍历可不可以也能像前序遍历那样改变操作节点语句的顺序就可以了呢?答案是不可以的,因为中序遍历的在迭代法上的逻辑跟前序后序有些不一样,去举个简单的例子试试就知道了。

// 中序遍历
var traversal = function(root){
	let result = [];
	let stack = [];
	let cur = root;
	while(cur || stack.length){
		if(cur){
			stack.push(cur);
			cur = cur.left
		}else{
			cur = stack.pop();
			result.push(cur.val);
			cur = cur.right;
		}
	}
	return result;
}

4.统一迭代

统一迭代也就是层序遍历,这里我们需要用到队列,遍历一层出队一层,遍历一个出队一个。

// 层序遍历
var reversal = function(root){
	let queue = [];
	let size = 0;
	let result = [];
	if(root)queue.push(root);
	while(queue.length){
		size = queue.length;
		let vec = [];
		while(size--){
			let cur = queue.shift();
			if(cur.left)queue.push(cur.left);
			if(cur.right)queue.push(cur.right);
		}
		result.push(vec);
	}
	return result;
}

你可能感兴趣的:(卡尔算法营,算法,数据结构)