二叉树
1)满二叉树是特殊的完全二叉树
2)满二叉树的结点个数是2^高度-1
3)深度优先搜索:
《1》前序 根+左子树前序遍历+右子树前序遍历(第一次遇见时打印)
《2》中序 左子树中序遍历+根+右子树中序遍历(第二次 遇见时打印)
《3》后续 左子树后序遍历+右子树后序遍历+根(第三次遇见时打印)
4)广度优先搜索:层序
5)写递归方法最重要的一点是,不要过早尝试递归展开过程
6)空树:只有一个结点的树
递归方法:找递推公式和终止条件
前中后的变形体:
【1】用遍历的思想:
保存结果的位置独立在递归之外。每次调用之前需要把结果重置一次。
【2】用汇总的思想:
把二叉树看成三部分;根+左子树+右子树
基础练习代码:
import java.util.ArrayList;
import java.util.List;
public class BurneyTree {
private static class Node{
int val;
private Node left=null;
private Node right=null;
public Node(int val){
this.val=val;
}
public String toString(){
return String.format("{%c}",val);
}
}
//前序遍历
public static void priTrival(Node root){
if(root==null){
return ;
}
System.out.println(root);
priTrival(root.left);
priTrival(root.right);
}
//中序遍历
public static void inOrdertravelsal(Node root){
if(root==null)
return ;
inOrdertravelsal(root.left);
System.out.println(root);
inOrdertravelsal(root.right);
}
//后序遍历
public static void postordertravelsal(Node root){
if(root==null)
return;
postordertravelsal(root.left);
postordertravelsal(root.right);
System.out.println(root);
}
//汇总(前序遍历)
public static List<Integer> pre2(Node root){
if(root==null)
return new ArrayList<>();
List<Integer>left=pre2(root.left);
List<Integer>right=pre2(root.right);
List<Integer>list=new ArrayList<>();
list.add(root.val);
list.addAll(left);
list.addAll(right);
return list;
}
//求结点个数
public static int getSize2(Node root){
if(root==null)
return 0;
int left=getSize2(root.left);
int right= getSize2(root.right);
return left+right+1;
}
//求叶子结点个数
public static int getyezi2(Node root){
if(root==null)
return 0;
if(root.left==null&&root.right==null){
return 1;
}
int left=getyezi2(root.left);
int right=getyezi2(root.right);
return left+right;
}
//求树的高度
public int getHeight(Node root){
if(root==null)
return 0;
int left=getHeight(root.left);
int right=getHeight(root.right);
int m=Math.max(left,right);
return m+1;
}
//返回第k层的结点个数(汇总)
public static int getklevel(Node root,int k){
if(root==null)
return 0;
if(k==1)
return 1;
int left=getklevel(root.left,k-1);
int right=getklevel(root.right,k-1);
return left+right;
}
//查找val的结点
public static Node find(Node root,int val){
if(root==null)
return null;
if(root.val==val)
return root;
Node n=find(root.left,val);
if(n!=null){
return n;
}
Node m=find(root.right,val);
if(m!=null){
return m;
}
return null;
}
//查找是否有val
public static boolean find1(Node root,int val){
if(root==null)
return false;
if(root.val==val)
return true;
if( find1(root.left,val))
return true;
return find1(root.right,val);
}
//判断是否互为镜像
public static boolean isMirrorTree(Node p,Node q){
if(p==null&&q==null)
return true;
if(p==null||q==null)
return false;
if(p!=null&&q!=null){
return (p.val==q.val)&&(isMirrorTree(p.left,q.right))&&(isMirrorTree(p.right,q.left));
}
return false;
}
}