1. 二叉树
二叉树结构:
- 概念:任何一个节点的子节点数量不超过2
- 特点:子节点分左节点和右节点。左右节点不能随意颠倒位置

- 满二叉树:所有叶子节点都在最后一层,而且节点的总数为2-1,n是树的高度
- 完全二叉树:所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二节的叶子节点在右边连续
- 遍历二叉树:

前序遍历:1 2 4 5 3 6 7 中序遍历:4 2 5 1 6 3 7 后序遍历:4 5 2 6 7 3 1 层序遍历:1 2 3 4 5 6 7
前序遍历、前序遍历,后序遍历和层序遍历,以及其他操作
package pegatron.sw.learn;import java.util.LinkedList;import java.util.Queue;public class TreeNode {//数的权(值)int data;//创建左儿子TreeNode leftNode;//创建右儿子TreeNode rightNode;public TreeNode() {}public TreeNode(int data) {this.data=data;}public void setLeftNode(TreeNode leftNode) {this.leftNode = leftNode;}public void setRightNode(TreeNode rightNode) {this.rightNode = rightNode;}//获取二叉树高度public int depth(TreeNode node){if(node != null){int l=depth(node.leftNode);int r=depth(node.rightNode);if(l>r){return l+1;}else{return r+1;}}return 0;}//前序遍历(递归方法) 根节点 -> 左节点 -> 左子节点 -> 右子节点 -> 右节点-> 左子节点 -> 右子节点public void frontShow() {System.out.println(data);//先打印自己//在打印左节点if(leftNode != null){leftNode.frontShow();}//在遍历右节点if(rightNode != null){rightNode.frontShow();}}//中序遍历(递归方法)左节点 -> 根节点 ->右节点public void middleShow() {//先遍历左节点if(leftNode != null){leftNode.middleShow();}//打印当前节点数据System.out.println(data);//在遍历右节点if(rightNode != null){rightNode.middleShow();}}//后序遍历(递归方法) 左节点 -> 右节点 -> 根节点public void afterShow() {//先遍历左节点if(leftNode != null){leftNode.afterShow();}//在遍历右节点if(rightNode != null){rightNode.afterShow();}//后打印当前节点System.out.println(data);}//层序遍历(递归方法) 根节点 -> 左节点 -> 右节点-> 左子节点 -> 右子节点 -> 左子节点 -> 右子节点public void levelShow(TreeNode node) {if(node == null) return;Queue<TreeNode> queue=new LinkedList<TreeNode>();queue.add(node);while(!queue.isEmpty()){TreeNode root=queue.poll();System.out.println(root.data);if(root.leftNode != null){queue.add(root.leftNode);}if(root.rightNode!=null){queue.add(root.rightNode);}}}//二叉树的镜像public TreeNode jingxiang(TreeNode node){if(node == null){return null;}TreeNode root=node.leftNode;node.leftNode=node.rightNode;node.rightNode=root;jingxiang(node.leftNode);jingxiang(node.rightNode);return node;}//前需查找public TreeNode frontSearch(int i) {//先创建一个值作为找到的值TreeNode value=null;//判断当前值是否与要查的值一样if(this.data == i){return this;//如果一样则返回//如果不一样}else {//就先查询左节点中又是否有要查的值if(leftNode != null){//有可能查到,也可能查不到,查不到的话,value还是一个nullvalue=leftNode.frontSearch(i);}//如果不为空,说明左节点中已经查到,if(value != null){return value;}//如果左节点没有就查询右节点if(rightNode != null){value=rightNode.frontSearch(i);}}return value;}//中序查找public TreeNode midSearch(int i) {//先创建一个值作为找到的值TreeNode value=null;//就先查询左节点中又是否有要查的值if(leftNode != null){//有可能查到,也可能查不到,查不到的话,value还是一个nullvalue=leftNode.midSearch(i);}//如果不为空,说明左节点中已经查到,if(value != null){return value;}if(this.data == i){return this;}//如果左节点没有就查询右节点if(rightNode != null){value=rightNode.midSearch(i);}return value;}//后序查找public TreeNode afterSearch(int i) {//先创建一个值作为找到的值TreeNode value=null;if(leftNode != null){//有可能查到,也可能查不到,查不到的话,value还是一个nullvalue=leftNode.midSearch(i);}//如果不为空,说明左节点中已经查到,if(value != null){return value;}//如果左节点没有就查询右节点if(rightNode != null){value=rightNode.midSearch(i);}//如果不为空,说明右节点中已经查到,if(value != null){return value;}if(this.data == i){return this;}return value;}/**删除树* @param i 要删除的节点的数据** 逻辑:先判断左节点的数据是否是要删除的数据,如果是则让左儿子为空即为删除。右儿子同理* 如果上面条件不符合,则递归检查删除左右儿子**/public void delete(int i) {TreeNode parent=this;//判断左儿子if(parent.leftNode != null && parent.leftNode.data ==i){parent.leftNode=null;return;}//判断右儿子if(parent.rightNode!= null &&parent.rightNode.data == i){parent.rightNode=null;return;}//递归检查并删除左儿子parent=leftNode;if(parent != null){parent.delete(i);}//递归检查并删除左儿子parent=rightNode;if(parent != null){parent.delete(i);}}}
顺序存储二叉树
- 顺序存储的二叉树通常情况只考虑完全二叉树
- 特点:
- 第n个元素的左子节点是:2*n+1
- 第n个元素的右子节点是:2*n+2
- 第n个元素的父节点是:(n-1)/2
