当前位置: 首页 > 科技观察

磁盘二叉树,建议从这些基础开始...

时间:2023-03-22 11:30:30 科技观察

1.基本二叉树是一个每个节点最多有两个子树的树状结构,它有如下性质:在二叉树中,第i-第th层最多有2^(i-1)个节点。如果二叉树的深度为K,那么二叉树至多有2K-1个节点。对于任意一棵二叉树,如果叶子节点(度为0)的个数为m,度为2的节点个数为n,则m=n+1。2.二叉树分类全二叉树如果每个节点的度二叉树中除叶子节点外都是2,则称这棵二叉树为满二叉树。满二叉树示意图完全二叉树如果去掉二叉树中的最后一层节点是一棵满二叉树,最后一层的节点从左到右依次分布,那么这棵二叉树就是称为完全二叉树。完全二叉树示意图搜索一棵二叉树如果一棵树不为空,且其根节点左子树不为空,则其左子树上方所有节点的值均小于其根节点的值,若它的右子树不为空,那么它的右子树中任意一个节点的值都大于它的根节点的值,左右子树也都是二叉搜索树。平衡二叉树,又称AVL树,是一棵空树或其左右子树的高度差的绝对值不超过1,左右子树都是平衡二叉树。3.二叉树遍历为了实现二叉树遍历,我们首先需要一颗二叉树。让我们设计一个简单的二叉树如下://jsversionconstbinaryTree={val:10,left:{val:8,right:{val:9}},right:{val:15}};(1)二叉树的前序遍历二叉树的前序遍历就是按照“根节点-左节点-右节点”的顺序遍历二叉树。具体实现如下所示://递归版本functionpreOrderTraverse(head){if(head==null){return;}console.log(head.val);preOrderTraverse(head.left);preOrderTraverse(head.right);}//对于先序遍历的非递归版本,准备一个栈,然后将head压入栈中,循环弹出一个值。如果有右孩子,先推右孩子,再推左孩子。functionpreOrderTraverseUnRecur(head){if(head==null){返回;}常量堆栈=[];堆栈。推(头);while(stack.length>0){head=stack.pop();控制台日志(head.val);如果(head.right!=null){stack.push(head.right);}if(head.left!=null){stack.push(head.left);}}}(2)中序遍历二叉树的中序遍历是按照“左节点-根节点-右节点”的顺序遍历这棵二叉树。具体实现如下://递归版本函数inOrderTraverse(head){if(head==n全){返回;}inOrderTraverse(head.left);控制台日志(head.val);inOrderTraverse(head.right);}/***非递归版本实现*准备一个栈*先将所有左边节点压入*如果栈中当前节点为空,则从栈中取出一个print,运行当前右边的节点*/functioninOrderTraverseUnRecur(head){if(head==null){return;}常量堆栈=[];while(stack.length>0||head!=null){if(head!=null){stack.push(head);head=head.left;}else{head=stack.pop();console.log(head.val);head=head.right;}}}(3)二叉树后续遍历的后序遍历,就是按照“左节点-右节点-根节点”的顺序遍历二叉树。具体实现如下://递归版本functionposOrderTraverse(head){if(head==null){return;}posOrderTraverse(head.left);posOrderTraverse(head.right);console.log(head.val);}//对于非递归版本,后面是left-right-root,但是我们可以按照root-right-left入栈,弹出为left-右根函数posOrderTraverseUnRecur(head){if(head==null){return;}常量堆栈=[];常量堆栈1=[];ack.push(头);while(stack.length>0){head=stack.pop();stack1.push(head.val);如果(head.left!=null){stack.push(head.left);}if(head.right!=null){stack.push(head.right);}}while(stack1.length>0){console.log(stack1.pop());}}(4)DFS(深度优先遍历)深度优先遍历的主要思想是从根节点开始,沿着一条路一直走到终点,然后从终点的节点回滚这条路到上一个节点,再从另一条路走到尽头,不断递归重复,直到遍历完所有顶点。二叉树的深度优先是二叉树的先序遍历。函数DFS1(head){if(head==null){返回;}console.log(head.val);DFS1(头。左);DFS1(head.right);}//深度优先二叉树是二叉树栈的前序遍历实现函数DFS2(head){if(head==null){return;}常量堆栈=[头];while(stack.length>0){head=stack.pop();控制台日志(head.val);如果(head.right!=null){stack.push(head.right);}if(head.left!=null){stack.push(head.left);}}}(5)BFS(breadth-firsttraversal)广度优先遍历是指逐层遍历树的内容,可以使用队列来实现。函数BFS(head){if(head==null){return;}常量列表=[头];while(list.length>0){head=list.shift();控制台日志(head.val);if(head.left!=null){列表。推(头。左);}if(head.right!=null){列表。推(头。右);}}}

猜你喜欢