javase(3)_二叉树
// 1.求二叉树中的节点个数
// 2.求二叉树的深度
// 3.前序遍历,中序遍历,后序遍历
// 4.分层遍历二叉树(按层次从上往下,从左往右)
// 5.将二叉查找树变为有序的双向链表
// 6.求二叉树第K层的节点个数
// 7.求二叉树中叶子节点的个数
// 8.判断两棵二叉树是否结构相同
// 9.判断二叉树是不是平衡二叉树
// 10.判断二叉树是不是完全二叉树
节点
class Node{
Node leftChild;
Node rightChild;
Object value;
public Node(Node leftChild, Node rightChild, Object value) {
this.leftChild = leftChild;
this.rightChild = rightChild;
this.value = value;
}
}
实现
//求二叉树节点个数
public static int getNodeNum(Node root){
if(root==null)
return 0;
return getNodeNum(root.leftChild)+getNodeNum(root.rightChild)+1;
}
//求二叉树的深度
public static int getDepth(Node root){
if(root==null)
return 0;
int leftDepth = getDepth(root.leftChild);
int rightDepth = getDepth(root.rightChild);
return leftDepth>=rightDepth?leftDepth+1:rightDepth+1;
}
//前序遍历,中续遍历,后续遍历
public static void preOrderTraversal(Node root){
if(root==null)
return;
System.out.print(root.value);
preOrderTraversal(root.leftChild);
preOrderTraversal(root.rightChild);
}
public static void inOrderTraversal(Node root){
if(root==null)
return;
inOrderTraversal(root.leftChild);
System.out.print(root.value);
inOrderTraversal(root.rightChild);
}
public static void postOrderTraversal(Node root){
if(root==null)
return;
postOrderTraversal(root.leftChild);
postOrderTraversal(root.rightChild);
System.out.print(root.value);
}
//分层遍历二叉树(按层次从上往下,从左往右)
public static void levelTraversal(Node root){
if(root==null)
return;
LinkedList<Node> ll = new LinkedList<Node>();
ll.offer(root);
while(!ll.isEmpty()){
root=ll.poll();
System.out.println(root.value);
if(root.leftChild!=null)
ll.offer(root.leftChild);
if(root.rightChild!=null)
ll.offer(root.rightChild);
}
}
//二叉查找树变为有序的双向链表
static LinkedList<Node> ll=new LinkedList<Node>();
public static LinkedList<Node> binarySearchTreetoDoubleEndList(Node node){
if(node==null)
return null;
binarySearchTreetoDoubleEndList(node.leftChild);
ll.offer(node);
binarySearchTreetoDoubleEndList(node.rightChild);
return ll;
}
//求二叉树第K层的节点个数
public static int getNodeNumkthLevel(Node root,int k){
if(root==null)
return 0;
if(root.leftChild==null&&root.rightChild==null) //if(k==1)
return 1;
int leftNum=getNodeNumkthLevel(root.leftChild,k-1);
int rightNum=getNodeNumkthLevel(root.rightChild,k-1);
return leftNum+rightNum;
}
//求二叉树中叶子节点的个数
public static int getleafNodeNum(Node root){
if(root==null)
return 0;
if(root.leftChild==null&&root.rightChild==null)
return 1;
int leftNum=getleafNodeNum(root.leftChild);
int rightNum=getleafNodeNum(root.rightChild);
return leftNum+rightNum;
}
//判断两棵二叉树是否结构相同
public static boolean isSameTree(Node n1,Node n2){
if(n1==null&&n2==null)
return true;
if(n1==null||n2==null)
return false;
boolean l = isSameTree(n1.leftChild,n2.leftChild);
boolean r = isSameTree(n1.rightChild,n2.rightChild);
return l&&r;
}
//判断二叉树是不是平衡二叉树
public static boolean isBalanceTree(Node root){
if(Math.abs(getDepth(root.leftChild)-getDepth(root.rightChild))>1)
return false;
if(Math.abs(getDepth(root.leftChild)-getDepth(root.rightChild))<1)
return true;
boolean l = isBalanceTree(root.leftChild);
boolean r = isBalanceTree(root.rightChild);
return l&&r;
}
//判断二叉树是不是完全二叉树
public static boolean isCompleteTree(Node root){
if(root.leftChild==null&&root.rightChild==null)
return true;
if(root.leftChild==null||root.rightChild==null)
return false;
boolean l = isCompleteTree(root.leftChild);
boolean r = isCompleteTree(root.rightChild);
return l&&r;
}
javase(3)_二叉树的更多相关文章
- [javaSE] 数据结构(二叉树-遍历与查找)
前序遍历:中,左,右 中序遍历:左,中,右 后序遍历:左,右,中 二叉树查找 从根节点进行比较,目标比根节点小,指针移动到左边 从根节点进行比较,目标比根节点大,指针移动到右边 /** * 前序遍历 ...
- javase(5)_面向对象
一.概述 1.面向对象是一种思想,让我们由执行者变成指挥者,执行者是面向过程,指挥者是面向对象.例如人开冰箱门,开冰箱门这个动作应该属于门而不是人,冰箱自己最清楚门应该怎么开,人只是调用了冰箱的这个动 ...
- javase(1)_基础语法
一.java概述 1.Java语言特点:纯面向对象(一切皆对象),平台无关(JVM屏蔽底层运行平台的差异),不同的平台有不同的JVM,JVM将程序翻译成当前操作系统能执行的程序,一次编译到处运行),健 ...
- c_数据结构_二叉树的遍历实现
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #d ...
- c语言_二叉树的建立以及3种递归
二叉树c语言的实现 二叉树的建立 二叉树的数据结构 typedef struct node{ int data; struct node* left; struct node* ri ...
- javase(13)_网络编程
一.概述 1.网络编程的核心是IP.端口(表示应用程序).协议三大元素 2.网络编程的本质是进程间通信 3.网络编程的2个主要问题:1是定位主机,2是数据传输 二.网络通信的概念 1.网络通信协议 计 ...
- javase(12)_集合框架_Queue
一.Queue Queye接口体系图 体系分析: Deque实现类:ArrayDeque, LinkedList(数组和链表实现双向队列) BlockingDeque实现类:LinkedBlockin ...
- javase(10)_多线程基础
一.排队等待 1.下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬件 ...
- javase(8)_集合框架_List、Set、Map
一.集合体系(不包括Queue体系) 二.ArrayList ArrayList的属性 private transient Object[] elementData; //存储元素 private i ...
随机推荐
- hdu3949XOR(线性基)
传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 题目大意:求一堆数字能异或出的第$k$大的数是多少 线性基求第k大好珂怕…… 据大佬们说就是把$k$给二进制拆分,如果$k$的第$i$位为1,那么$ ...
- C# 正则表达式输出查询结果
//正则 第一种方法 Regex regex = new Regex(@"\d{0,}\.\d{0,}\,\d{0,}\.\d{0,}&quo ...
- C 语言实例 - 使用结构体(struct)
C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...
- (转)linux du命令
转自 http://www.cnblogs.com/peida/archive/2012/12/10/2810755.html Linux du命令也是查看使用空间的,但是与df命令不同的是Linux ...
- window git bash客户端vimrc设置tab缩进
从开发机写的代码,弄到windows上的客户端git提交,总是显示格式对不起的问题,问题是再vimrc上tab键的缩进不等于4个空格,然后就需要设置成和linux一样的四格缩进. 安装上git bas ...
- java操作rabbitmq实现简单的消息发送(socket编程的升级)
准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...
- 自定义的cell上面有图片时,如果产生了重用,图片可能会错乱问题
当被重用的cell将要显示时,会调用这个方法,这个方法最大的用武之地是当你自定义的cell上面有图片时,如果产生了重用,图片可能会错乱(当图片来自异步下载时及其明显),这时我们可以重写这个方法把内容抹 ...
- kojs select绑值(工作)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <tit ...
- POJ-1020-Anniversary Cake
链接:https://vjudge.net/problem/POJ-1020 题意: 给一个宽为s的正方形,再给n个变长为an的小正方形, 判断是否能将这n个小正方形完全填充到这个大正方形里面. 思路 ...
- Elasticsearch之入门知识
elasticsearch是一个高度可扩展得开源全文搜索和分析的引擎.可以快速.近实时的存储,搜索和分析大量数据.通常用作底层引擎技术,为具有复杂搜索功能和要求的程序提供支持. 用处: • 运行网上商 ...