定义
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 。 ### 基本形态
二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态: [3]
1、空二叉树——如图 ;
2、只有一个根结点的二叉树——如图 ;
3、只有左子树——如图 ;
4、只有右子树——如图 ;
5、完全二叉树——如图 。
特殊类型
1、满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树 。
2、完全二叉树:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k,有n个结点的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树 。
完全二叉树的特点是叶子结点只可能出现在层序最大的两层上,并且某个结点的左分支下子孙的最大层序与右分支下子孙的最大层序相等或大1。
书面语
- 性质1:二叉树的第i层上至多有2i-1(i≥1)个节点 。
- 性质2:深度为h的二叉树中至多含有2h-1个节点 。
- 性质3:若在任意一棵二叉树中,有n个叶子节点,有n2个度为2的节点,则必有n0=n2+1 。
- 性质4:具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数) 。
- 性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:
- 当i=1时,该节点为根,它无双亲节点 。
- 当i>1时,该节点的双亲节点的编号为i/2 。
- 若2i≤n,则有编号为2的左孩子,否则没有左孩子 。
- 若2+1≤n,则有编号为2i+1的右孩子,否则没有右孩子 。
简单实现数的前中后序遍历
二叉树
根结点为0
左儿子 2i+1
右儿子 2i+2
父节点(i-1)/2
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
function TreeAndArray(arr) {
preOrder(arr, 0)
inOrder(arr, 0)
PostOrder(arr,0)
/*
树的先序遍历
*/
function preOrder(arr, index) {
if (index >= arr.length) {
return;
}
console.log(arr[index]); //先输出根节点
preOrder(arr, index * 2 + 1); //左子树
preOrder(arr, index * 2 + 2) //右子树
}
/*
中序遍历
*/
function inOrder(arr, index) {
if (index >= arr.length) {
return;
}
inOrder(arr, index * 2 + 1);
console.log(arr[index]);
inOrder(arr, index * 2 + 2)
}
/*
后序变历
*/
function PostOrder(arr,index){
if (index >= arr.length) {
return;
}
PostOrder(arr,2*index+1)
PostOrder(arr,2*index+2)
console.log(arr[index]);
}
}
TreeAndArray([78, 56, 34, 43, 4, 1, 15, 2, 23])
结果
78,56,43,2,23,4,34,1,15,
2,43,23,56,4,78,1,34,15,
2,23,43,4,56,1,15,34,78,