二叉树
定义:每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。
平衡二叉树
定义:二叉树中,每一个节点的左右子树的高度相差不能大于 1,称为平衡二叉树。
- 满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树
- 完全二叉树:深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h 层所有的结点都连续集中在最左边
二叉树的遍历
1、前序遍历(先根遍历)
根节点 -> 左子树 -> 右子树
举个🌰:给定一个二叉树,返回它的前序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
解法1:递归实现
var preorder = function(root, array = []) {
if(root){
array.push(root.val);
preorder(root.left, array);
preorder(root.right, array);
}
return array;
};
解法2:非递归实现
取跟节点为目标节点,开始遍历
- 1.访问目标节点
- 2.左孩子入栈 -> 直至左孩子为空的节点
- 3.节点出栈,以右孩子为目标节点,再依次执行1、2、3
var preorder = function(root) {
let stack = [];
let result = [];
while(root || stack.length){
while(root){
stack.push(root);
result.push(root.val);
root = root.left;
}
root = stack.pop();
root = root.right;
}
return result;
};
2、中序遍历(中根遍历)
左子树 -> 根节点 -> 右子树
举个🌰:给定一个二叉树,返回它的中序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
解法1:递归实现
var inorder = function(root, array = []) {
if(root){
inorder(root.left, array);
array.push(root.val);
inorder(root.right, array);
}
return array;
};
解法2:非递归实现
取跟节点为目标节点,开始遍历
- 1.左孩子入栈 -> 直至左孩子为空的节点
- 2.节点出栈 -> 访问该节点
- 3.以右孩子为目标节点,再依次执行1、2、3
var inorder = function(root) {
let stack = [];
let result = [];
while(root || stack.length){
while(root){
stack.push(root);
root = root.left;
}
root = stack.pop();
result.push(root.val);
root = root.right;
}
return result;
};
3、后序遍历(后根遍历)
左子树 -> 右子树 -> 根节点
举个🌰:给定一个二叉树,返回它的后序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
解法1:递归实现
var postorder = function(root, array = []) {
if(root){
postorder(root.left, array);
postorder(root.right, array);
array.push(root.val);
}
return array;
};
解法2:非递归实现
var postorder = function(root) {
let stack =[]
let result = []
while(root || stack.length){
while(root){
stack.push(root)
result.push(root.val);
root = root.right;
}
root = stack.pop();
root = root.left;
}
return result.reverse(); // 倒过来:左->右->根
};