树
1.树形结构
- 树形结构有一个根节点;
- 树是一种有向无环的图;
- 树形结构没有回路;
概念:
根节点:最开始的节点;
叶子结点:没有子节点;
节点:除去根节点和叶子结点后的普通节点;
数的度:树的分叉中,具有最多的分叉,即度为分叉的个数;
树的深度:树最深有几层,深度就为几;
2.二叉树
定义二叉树构建函数
function Node(value){
this.value=value;
this.left=null;
this.right=null;
}
满二叉树
- 所有叶子结点都在最底层
- 每个非叶子节点都有两个节点
完全二叉树
国内定义:
- 叶子结点都在最后一层或在倒数第二层;
- 叶子结点都向左聚拢;
国外定义:
- 叶子结点都在最后一层或在倒数第二层;
- 如果有叶子节点,就必然有两个叶子结点;
二叉树中子树
子树:二叉树中,每一个节点或叶子节点都是一颗子树的根节点;
左子树、右子树:
3.二叉树的遍历
前序遍历
先打印当前的,再打印左边的,再打印右边的
代码实现
function bianli(root){
if(root==null) return;
console.log(root.value);
bainli(root.left);
bianli(root.right);
}
中序遍历
先打印左边的,再打印中间的,再打印右边的
代码实现
function bianli(root){
if(root==null) return;
bainli(root.left);
console.log(root.value);
bianli(root.right);
}
后续遍历
先打印左边的,再打印右边的,再打印中间的
代码实现
function bianli(root){
if(root==null) return;
bainli(root.left);
bianli(root.right);
console.log(root.value);
}
4.二叉树还原
根据前序和中序还原后续
代码实现
var qian = ['a', 'c', 'f', 'g', 'b', 'd', 'e'];
var zhong = ['f', 'c', 'g', 'a', 'd', 'b', 'e'];
function Node (value){
this.value=value;
this.left=null;
this.right=null;
}
function f1(qian,zhong){
if(qian==null||zhong==null||qian.length==0||zhong.length==0||qian.length!=zhong.length) return;
var root=new Node(qian[0]);
var index=zhong.indexOf(root.value);//找到根节点在中序遍历中的位置
var qianLeft=qian.slice(1,1+index);//前序遍历的左子树
var qianRight=qian.slice(1+index,qian.length);//前序遍历的右子树
var zhongLeft=zhong.slice(0,index);//中序遍历的左子树
var zhongRight=zhong.slice(index+1,zhong.length);//中序遍历的右子树
root.left=f1(qianLeft,zhongLeft);//根据左子树的前序和中序还原左子树并赋值给root.left
root.right=f1(qianRight,zhongRight);//根绝右子树的前序和中序还原右子树并赋值给root.right
return root;
}
var root = f1(qian, zhong);
console.log(root.left);
console.log(root.right);
根据中序和后续还原前序
代码实现
var zhong = ['f', 'c', 'g', 'a', 'd', 'b', 'e'];
var hou = ['f', 'g', 'c', 'd', 'e', 'b', 'a'];
function Node(value) {
this.value = value;
this.left = null;
this.right = null;
}
function f1(zhong, hou) {
if (zhong == null || hou == null || zhong.length == 0 || hou.length == 0 || zhong.length != hou.length) return null;
var root = new Node(hou[hou.length - 1]);
var index = zhong.indexOf(root.value);
var leftZhong = zhong.slice(0, index);
var rightZhong = zhong.slice(index + 1, zhong.length);
var leftHou = hou.slice(0, index);
var rightHou = hou.slice(index, hou.length - 1);
root.left = f1(leftZhong, leftHou);
root.right = f1(rightZhong, rightHou);
return root;
}
var root = f1(zhong, hou);
console.log(root.left);
console.log(root.right);