1:统计二义树中度为1的结点个数、统计二叉树中度为2的结点个数、统计二叉树中度为0的结点个数。
package com.company;
public class Tree {
int val;
Tree lChild;
Tree rChild;
public Tree(){
val=0;
rChild=null;
lChild=null;
}
public Tree(int value){
this.val=value;
lChild=null;
rChild=null;
}
}
public class Main {
private static Tree T;
private static int degreeOne;
private static int degreeZero;
private static int degreeTwo;
public static void main(String[] args){
T=new Tree(10);
createTree();
countDegreeZero(T);
countDegreeOne(T);
countDegreeTwo(T);
System.out.println("度为0的结点个数:"+degreeZero);
System.out.println("度为1的结点个数:"+degreeOne);
System.out.println("度为2的结点个数:"+degreeTwo);
}
public static void createTree(){
T.lChild=new Tree(2);
T.rChild=new Tree(4);
T.lChild.lChild=new Tree(7);
T.lChild.rChild=new Tree(9);
T.lChild.lChild.lChild=new Tree(6);
T.rChild.rChild=new Tree(3);
}
public static void countDegreeZero(Tree p){
if(p!=null){
if(p.lChild==null&&p.rChild==null){
//System.out.println("值为:"+p.val+" 的结点的度为0");
degreeZero++;
}
countDegreeZero(p.lChild);
countDegreeZero(p.rChild);
}
}
public static void countDegreeOne(Tree p){
if(p!=null){
if((p.lChild==null&&p.rChild!=null)||(p.rChild==null&&p.lChild!=null)){
//System.out.println("值为:"+p.val+" 的结点的度为1");
degreeOne++;
}
countDegreeOne(p.lChild);
countDegreeOne(p.rChild);
}
}
public static void countDegreeTwo(Tree p){
if(p!=null){
if(p.lChild!=null&&p.rChild!=null){
//System.out.println("值为:"+p.val+" 的结点的度为2");
degreeTwo++;
}
countDegreeTwo(p.lChild);
countDegreeTwo(p.rChild);
}
}
}
2.统计二叉树的高度。
用递归最方便
public static int heightTree(Tree p){
if(p!=null){
return max(heightTree(p.lChild),heightTree(p.rChild))+1;
}
else{
return 0;
}
}
3.统计二叉树的宽度
public static int calHeightTree(Tree p){
int firstLocation=0;
int lastLocation=0;
int preLastLocation=0;
Tree []layerNode=new Tree[10];
int maxNum=0;
//采用层次遍历的方法
layerNode[++lastLocation]=T;
preLastLocation=lastLocation;
firstLocation=lastLocation;
boolean flag=true;
while(flag) {
while (firstLocation <= preLastLocation) {
p = layerNode[firstLocation];
System.out.print(p.val+" ");
if (p.lChild != null) {
layerNode[++lastLocation] = p.lChild;
}
if (p.rChild != null) {
layerNode[++lastLocation] = p.rChild;
}
firstLocation++; //表示当前p结点访问过;
}
int length=lastLocation-firstLocation+1;
maxNum=maxNum>length? maxNum:length;
preLastLocation=lastLocation;
if(preLastLocation<firstLocation){
flag=false;
}
}
return maxNum;
}
4.从二叉树中删去所有叶结点
public static void deleteLeafNodes(Tree p,Tree pre){
if(p!=null){
if(p.rChild==null&&p.lChild==null&&pre!=null){
if(pre.lChild==p){
pre.lChild=null;
}
else if(pre.rChild==p){
pre.rChild=null;
}
System.out.println("叶子结点:"+p.val+"删除!");
}
deleteLeafNodes(p.lChild,p);
deleteLeafNodes(p.rChild,p);
}
}
5.计算指定结点*p所在的层次
//Tree p是树根结点,Tree node是指定要查找层次的结点,deep是当前访问的结点的层次。
//Tree p是树根结点,Tree node是指定要查找层次的结点,deep是当前访问的结点的层次。
public static int calConcreteLayer(Tree p,Tree node,int deep){
if(p!=null){
deep++;
if(p==node){
return deep;
}
else{
int deep1=calConcreteLayer(p.lChild,node,deep);
int deep2=calConcreteLayer(p.rChild,node,deep);
return deep1==0?deep2:deep1;
}
}
else{
return 0;
}
}
6.计算二叉树中各结点中的最大元素的值。
public static int findMaxValue(Tree p){
if(p!=null){
int maxLChild=findMaxValue(p.lChild);
int maxRChild=findMaxValue(p.rChild);
int Max=max(maxLChild,maxRChild);
return p.val>Max? p.val:Max;
}
else{
return 0;
}
}
7.交换二叉树中每个结点的两个子女。
public static void exchangeNodes(Tree p){
if(p!=null){
if(p.lChild!=null&&p.rChild!=null){
Tree temp;
temp=p.lChild.lChild;
p.lChild.lChild=p.rChild.lChild;
p.rChild.lChild=temp;
temp=p.lChild.rChild;
p.lChild.rChild=p.rChild.rChild;
p.rChild.rChild=temp;
temp=p.lChild;
p.lChild=p.rChild;
p.rChild=temp;
}
exchangeNodes(p.lChild);
exchangeNodes(p.rChild);
}
}
8.以先序次序输出一颗二叉树中所有结点的数据值及结点所在的层次。
public static void PTR(Tree p,int deep){
if(p!=null){
deep++;
System.out.println("该结点值为:"+p.val+" ,层次为:"+deep);
PTR(p.lChild,deep);
PTR(p.rChild,deep);
}
}
8.输入一个整数 data 和一棵二元树。从树的根结点开始往下访问一直到叶结点,所经过的所有结点形成一条路径。打印出路径及与 data 相等的所有路径。
例如,输入整数22 和右图所示的二元树,则打印出两条路径 10,12和10,5,7。
这里我原本用的ArrayList去存储当前路径的结点,但是我发现java中的引用太神奇了,递归到上一层但是下一层对ArrayList的操作依旧存在。。。,所以改用数组外加length固定当前数组得范围。
public static void main(String[] args) {
T=new Tree(10);
createTree();
Tree []arrayNode=new Tree[5];
int sum=0;
int data=22;
int length=0;
findPathLengthSame(T,arrayNode,length,sum,data);
}
public static void findPathLengthSame(Tree p,Tree[] arrayNode,int length,int sum,int data){
//采用先序遍历
if(p!=null){
arrayNode[length++]=p;
sum+=p.val;
if(p.rChild==null&&p.lChild==null){
if(sum==data) {
showPath(arrayNode,length);
}
sum-=p.val;
length--; //去掉最后一个
}
findPathLengthSame(p.lChild,arrayNode,length,sum,data);
findPathLengthSame(p.rChild,arrayNode,length,sum,data);
}
}
public static void showPath(Tree[] arrayList,int length){
System.out.print("路径为:");
for(int i=0;i<length;i++){
System.out.print(arrayList[i].val+" ");
}
System.out.println();
}