1,深度为k的完全二叉树中最少有2k-1个节点。
关于完全二叉树:只有下面两层节点的度可以小于2,并且最下层的叶节点集中在靠左的若干位置上(注(基本术语)
度:结点拥有的子树的个数;
叶节点:也叫终端结点,是度为 0 的结点;
结点层:根结点的层定义为第一层,根的孩子为第二层,依此类推;
树的深度:树中最大的结点层;
结点的度:结点拥有的子树的个数;
树的度: 树中最大的结点度;
分枝结点:度不为0的结点
)
关于满级二叉树:满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树;一棵完全二叉树,其某结点如果没有左孩子就一定不能有右孩子,且某结点没有左孩子或右孩子则它后面就不能有孩子( 一棵满二叉树必定是一棵完全二叉树,而完全二叉树不一定是满二叉树)
关于平衡二叉树:是一棵空树,或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
- 在二叉树的第 i 层上最多有
2^(i-1)
个结点(i>=1) - 深度为h的二叉树,最多有
2^h-1
个结点,最少有h个结点(h>=1) - 包含n个结点的二叉树的高度至少为
(log2n)+1
- 在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则
n0=n2+1
2,二叉树遍历----------前(先)序遍历【根(中)左右】,中序遍历【左根(中)右】,后序遍历【左右根(中)】;深度优先算法;
定义二叉树:
//二叉树的定义
function TreeNode(val, left, right) {
this.val = (val === undefined ? 0 : val);
this.left = (left === undefined ? null : left);
this.right = (right === undefined ? null :right);
}
创建二叉树(树图),还有其他的构建方式,因此方法更便于理解,故作展示:
let biTree = new TreeNode("A");
biTree.left = new TreeNode("B");
biTree.left.left = new TreeNode("D");
biTree.left.left.left = new TreeNode('H');
biTree.left.left.right = new TreeNode("I")
biTree.left.right = new TreeNode("E");
biTree.left.right.right = new TreeNode('G')
biTree.right = new TreeNode('C');
biTree.right.left = new TreeNode('F');
biTree.right.left.left = new TreeNode("K");
biTree.right.left.right = new TreeNode("L");
biTree.right.left.right.left = new TreeNode("M");
biTree.right.left.right.right = new TreeNode("N");
biTree.right.right = new TreeNode('G');
biTree.right.right.right = new TreeNode('O');
前(先)序遍历【根(中)左右】:
//二叉树的前序遍历 中左右
var preorderTraversal = function(root) { //传入根节点
let res = [];//返回遍历二叉树的数组
const dfs = function(root) {
if(root === null) return;
res.push(root.val);//中
dfs(root.left);//遍历左子树,直到叶子节点 逐层返回
dfs(root.right);//遍历右子树,直到叶子节点 逐层返回
}
dfs(root);//只使用一个参数,使用闭包进行储存结果
return res;
};
中序遍历【左根(中)右】:
//二叉树的中序遍历 左中右 与前序遍历相同,位置换一下
var inorderTraversal = function(root) {
let res = [];
const dfs = function(root) {
if(root === null) return;
dfs(root.left);
res.push(root.val);
dfs(root.right);
}
dfs(root);
return res;
};
序遍历【左右根(中)】:
//二叉树的后序遍历 左右中
var postorderTraversal = function(root) {
let res = [];
const dfs = function(root) {
if(root === null) return;
dfs(root.left);
dfs(root.right);
res.push(root.val);
}
dfs(root);
console.log(res);//打印看结果
return res;
}
postorderTraversal(biTree)
层序遍历:
引申“队列”
function levelOrder(root)
{
var queue = [], res = [];
queue.push(root);
while(queue.length != 0){
let len = queue.length; //一层结点个数
let temp = [];
for(let i = 0; i < len; i++){
var node = queue.shift();//shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
temp.push(node.val);
if(node.left)
queue.push(node.left);
if(node.right)
queue.push(node.right);
}
res.push(temp);
}
return res;
}