二叉树
一:二叉树的概念


(完全二叉树简单理解:除最后一层其它层都是满的,最后一层元素从左往右依次连续。(满二叉树也是完全二叉树))
二:二叉树的遍历 (要会用栈来实现)
(1)前序遍历:根->左->右
1 public void preOrder(){ 2 //先输出根节点 3 System.out.println(this); 4 //递归向左子树前序遍历 5 if(this.left != null){ 6 this.left.preOrder(); 7 } 8 //递归向右子树前序遍历 9 if(this.right != null){ 10 this.right.preOrder(); 11 } 12 }
(2)中序遍历:左->根->右
1 public void preOrder(){ 2 //递归向左子树前序遍历 3 if(this.left != null){ 4 this.left.preOrder(); 5 } 6 //输出根节点 7 System.out.println(this); 8 //递归向右子树前序遍历 9 if(this.right != null){ 10 this.right.preOrder(); 11 } 12 }
(3)后序遍历:左->右->根
1 public void preOrder(){ 2 //递归向左子树前序遍历 3 if(this.left != null){ 4 this.left.preOrder(); 5 } 6 //递归向右子树前序遍历 7 if(this.right != null){ 8 this.right.preOrder(); 9 } 10 //输出根节点 11 System.out.println(this); 12 }
栈实现后序遍历!!!
1 class Solution { 2 public List<Integer> postorderTraversal(TreeNode root) { 3 4 TreeNode pre = null; 5 List<Integer>ans = new ArrayList(); 6 Deque<TreeNode>stack = new ArrayDeque(); 7 while(!stack.isEmpty() || root != null){ 8 if(root!=null){ 9 stack.push(root); 10 root = root.left; 11 }else{ 12 root = stack.peek(); 13 if(root.right==null || root.right==pre){ 14 stack.pop(); 15 ans.add(root.val); 16 pre = root; 17 root = null; 18 }else{ 19 root = root.right; 20 } 21 } 22 } 23 return ans; 24 } 25 }
三:顺序存储二叉树
即:将二叉树中的元素按照要求(前中后序)顺序存入到数组中。

四:线索化二叉树(在空指针域加入了前驱结点和后继结点)


五:赫夫曼树



赫夫曼编码原理(流程):(可以无损压缩,满足前缀编码)


六:二叉排序树(又叫二叉搜索树,二叉查找树)
注意:二叉排序树有个特性,即其中序遍历得到的值序列是递增有序的!


删除二叉排序树的结点:三种情况思路分析




七:平衡二叉树(AVL树)
是对二叉排序树的优化

(1)当右子树高度-左子树高度 > 1, 则进行左旋转。

(2)当左子树高度-右子树高度 > 1,则进行右旋转。

(3)有些情况下,进行单旋转无法转成平衡二叉树,因此需要双旋转。
比如:(如图所示,右旋转操作后仍然不是平衡二叉树)当前树满足右旋转条件,但是当前根结点的左孩子结点的右子树高度大于该孩子结点的左子树的高度,则就首先需要对该孩子结点进行左旋转,然后再对当前根结点进行右旋转。(另一种情况相反操作即可)

八:多路查找树(B-树,B+树,B*树)Balanced






参考:https://www.bilibili.com/video/BV1E4411H73v?
浙公网安备 33010602011771号