java二叉树怎么初始化_java实现二叉树常见操作
packagecom.xk.test.struct.newp;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Stack;public classMyBinaryTree {/*** 插入节点
*@paramroot
*@paramnode
*@return
*/TreeNode insertNode(TreeNode root,TreeNode node){if(root ==node){returnnode;
}
TreeNode tmp= newTreeNode();
tmp=root;
TreeNode last= null;while(tmp!=null){
last=tmp;if(tmp.val>node.val){
tmp=tmp.left;
}else{
tmp=tmp.right;
}
}if(last!=null){if(last.val>node.val){
last.left=node;
}else{
last.right=node;
}
}returnroot;
}/*** 递归解法前序遍历
*@paramroot
*@return
*/ArrayListpreOrderReverse(TreeNode root){
ArrayList result = new ArrayList();
preOrder2(root,result);returnresult;
}void preOrder2(TreeNode root,ArrayListresult){if(root == null){return;
}
result.add(root.val);
preOrder2(root.left,result);
preOrder2(root.right,result);
}/*** 迭代解法前序遍历
*@paramroot
*@return
*/ArrayListpreOrder(TreeNode root){
Stack stack = new Stack();
ArrayList list = new ArrayList();if(root == null){returnlist;
}
stack.push(root);while(!stack.empty()){
TreeNode node=stack.pop();
list.add(node.val);if(node.right!=null){
stack.push(node.right);
}if(node.left != null){
stack.push(node.left);
}
}returnlist;
}/*** 中序遍历
*@paramroot
*@return
*/ArrayListinOrder(TreeNode root){
ArrayList list = new ArrayList();
Stack stack = new Stack();
TreeNode current=root;while(current != null|| !stack.empty()){while(current != null){
stack.add(current);
current=current.left;
}
current=stack.peek();
stack.pop();
list.add(current.val);
current=current.right;
}returnlist;
}/*** 后序遍历
*@paramroot
*@return
*/ArrayListpostOrder(TreeNode root){
ArrayList list = new ArrayList();if(root == null){returnlist;
}
list.addAll(postOrder(root.left));
list.addAll(postOrder(root.right));
list.add(root.val);returnlist;
}/*** 最大深度
*@paramnode
*@return
*/
intmaxDeath(TreeNode node){if(node==null){return 0;
}int left =maxDeath(node.left);int right =maxDeath(node.right);return Math.max(left,right) + 1;
}/*** 层次遍历
*@paramroot
*@return
*/ArrayList>levelOrder(TreeNode root){
ArrayList> result = new ArrayList>();if(root == null){returnresult;
}
Queue queue = new LinkedList();
queue.offer(root);while(!queue.isEmpty()){int size =queue.size();
ArrayList level = new ArrayList();for(int i = 0;i < size ;i++){
TreeNode node=queue.poll();
level.add(node.val);if(node.left != null){
queue.offer(node.left);
}if(node.right != null){
queue.offer(node.right);
}
}
result.add(level);
}returnresult;
}/*** 最小深度
*@paramroot
*@return
*/
intgetMinDepth(TreeNode root){if(root == null){return 0;
}returngetMin(root);
}intgetMin(TreeNode root){if(root == null){returnInteger.MAX_VALUE;
}if(root.left == null&&root.right == null){return 1;
}return Math.min(getMin(root.left),getMin(root.right)) + 1;
}/*** 节点的个数
*@paramroot
*@return
*/
intnumOfTreeNode(TreeNode root){if(root == null){return 0;
}int left =numOfTreeNode(root.left);int right =numOfTreeNode(root.right);return left + right + 1;
}/*** 叶子节点的个数
*@paramroot
*@return
*/
intnumsOfNodeTreeNode(TreeNode root){if(root == null){return 0;
}if(root.left==null&&root.right==null){return 1;
}return numsOfNodeTreeNode(root.left)+numsOfNodeTreeNode(root.right);
}/*** 第k层节点的个数
*@paramroot
*@paramk
*@return
*/
int numsOfkLevelTreeNode(TreeNode root,intk){if(root == null||k<1){return 0;
}if(k==1){return 1;
}int numsLeft = numsOfkLevelTreeNode(root.left,k-1);int numsRight = numsOfkLevelTreeNode(root.right,k-1);return numsLeft +numsRight;
}/*** 翻转二叉树or镜像二叉树
*@paramroot
*@return
*/TreeNode mirrorTreeNode(TreeNode root){if(root == null){return null;
}
TreeNode left=mirrorTreeNode(root.left);
TreeNode right=mirrorTreeNode(root.right);
root.left=right;
root.right=left;returnroot;
}/*** 两个二叉树是否互为镜像
*@paramt1
*@paramt2
*@return
*/
booleanisMirror(TreeNode t1,TreeNode t2){if(t1==null&&t2==null){return true;
}if(t1==null||t2==null){return false;
}if(t1.val !=t2.val){return false;
}return isMirror(t1.left,t2.right)&&isMirror(t1.right,t2.left);
}/*** 是否是平衡二叉树
* 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
*@paramnode
*@return
*/
booleanisBalanced(TreeNode node){return maxDeath2(node)!=-1;
}intmaxDeath2(TreeNode node){if(node == null){return 0;
}int left =maxDeath2(node.left);int right =maxDeath2(node.right);if(left==-1||right==-1||Math.abs(left-right)>1){return -1;
}return Math.max(left, right) + 1;
}/*** 是否是完全二叉树
* 对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
*@paramroot
*@return
*/
booleanisCompleteTreeNode(TreeNode root){if(root == null){return false;
}
Queue queue = new LinkedList();
queue.add(root);boolean result = true;boolean hasNoChild = false;while(!queue.isEmpty()){
TreeNode current=queue.remove();if(hasNoChild){if(current.left!=null||current.right!=null){
result= false;break;
}
}else{if(current.left!=null&¤t.right!=null){
queue.add(current.left);
queue.add(current.right);
}else if(current.left!=null&¤t.right==null){
queue.add(current.left);
hasNoChild= true;
}else if(current.left==null&¤t.right!=null){
result= false;break;
}else{
hasNoChild= true;
}
}
}returnresult;
}/*** 是否是合法的二叉查找树(BST)
一棵BST定义为:
节点的左子树中的值要严格小于该节点的值。
节点的右子树中的值要严格大于该节点的值。
左右子树也必须是二叉查找树。
一个节点的树也是二叉查找树。*/
public int lastVal =Integer.MAX_VALUE;public boolean firstNode = true;public booleanisValidBST(TreeNode root) {//write your code here
if(root==null){return true;
}if(!isValidBST(root.left)){return false;
}if(!firstNode&&lastVal >=root.val){return false;
}
firstNode= false;
lastVal=root.val;if (!isValidBST(root.right)) {return false;
}return true;
}/*** 把二叉树打印成多行
*@parampRoot
*@return
*/ArrayList >Print(TreeNode pRoot) {
ArrayList > res = new ArrayList >();if(pRoot == null)returnres;
ArrayList temp = new ArrayList();
Queue layer = new LinkedList();
layer.offer(pRoot);int start = 0, end = 1;while(!layer.isEmpty()){
TreeNode node=layer.poll();
temp.add(node.val);
start++;if(node.left != null)
layer.add(node.left);if(node.right != null)
layer.add(node.right);if(start ==end){
start= 0;
res.add(temp);
temp= new ArrayList();
end=layer.size();
}
}returnres;
}/*** 按之字形顺序打印二叉树
*@parampRoot
*@return
*/
public ArrayList >PrintZ(TreeNode pRoot) {
ArrayList > res = new ArrayList >();
Stack s1 = new Stack();
Stack s2 = new Stack();int flag = 1;if(pRoot == null)returnres;
s2.push(pRoot);
ArrayList temp = new ArrayList();while(!s1.isEmpty() || !s2.isEmpty()){if(flag % 2 != 0){while(!s2.isEmpty()){
TreeNode node=s2.pop();
temp.add(node.val);if(node.left != null){
s1.push(node.left);
}if(node.right != null){
s1.push(node.right);
}
}
}if(flag % 2 == 0){while(!s1.isEmpty()){
TreeNode node=s1.pop();
temp.add(node.val);if(node.right != null){
s2.push(node.right);
}if(node.left != null){
s2.push(node.left);
}
}
}
res.add(new ArrayList(temp));
temp.clear();
flag++;
}returnres;
}
}classTreeNode{intval;//左孩子
TreeNode left;//右孩子
TreeNode right;
}
java二叉树怎么初始化_java实现二叉树常见操作相关推荐
- 二叉树初始化_Java实现二叉树
二叉查找树 二叉查找树(Binary Search Tree)也叫排序树或有序树或搜索树,它是为实现快速查找而生.二叉查找树的左子树的节点都小于它的父节点,右子树中的节点都大于它的父节点,因此若按中序 ...
- java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)
package com.yc.test; import java.util.ArrayList; import java.util.List; import com.yc.tree.ThreeLink ...
- java二叉树是什么_java数据结构二叉树是什么?特点是?
二叉树是什么?学习java的小伙伴可能经常会听到这个词,但具体是什么又不可知,下面小编就来带你详细了解下二叉树. 二叉树概念 二叉树,指计算机中的一种树结构,这种树结构中每个结点至多只有两个子树,它们 ...
- java中的文件_JAVA中文件的操作
在java中,对文件(例如图片)进行操作,包括上传.修改.删除 一,文件上传 1.文件传到哪里,不仅可以保存在数据库中,也可以上传到远程服务器,文件保存的是文件的路径 2.文件上传都需要做什么?写那些 ...
- java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例
本文实例讲述了java实现二叉树的建立.计算高度与递归输出操作.分享给大家供大家参考,具体如下: 1. 建立 递归输出 计算高度 前中后三种非递归输出 public class Tree_Link { ...
- java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)
二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...
- java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树
Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...
- java二叉树的深度_Java实现二叉树的深度计算
尝试不同方法求二叉树的深度: 1.depth1,递归计算二叉树的深度,根结点的深度=max(左子树的深度,右子树的深度) + 1. 2.depth2,访问左结点,如有右结点则压栈1,同时把右结点的深度 ...
- java编程的英文_Java编程基础常见英语词汇总编
Java编程基础常见英语词汇总编 以下是百分网小编收集的Java编程基础常见英语词汇,希望对您的学习有所帮助! Java编程基础常见英语词汇 OO:object-oriented ,面向对象 OOP: ...
最新文章
- 最后生成神么格式的代码_智能扩充机器人的“标准问”库之Query生成
- Geoserver怎样设置地图shp文件为相对路径,可轻松复制移植
- 【Python】Python办公自动化 | 一键给PDF文件加密,超方便
- Struts2 入门
- CDOJ 486 Good Morning 傻逼题
- 中国计算机考试区别及求职的相关思考
- 只知道大数据?你out了
- python hashlib 哈希算法
- java实例属性_Java 静态属性与实例属性的初始化
- 在eclipse中使用git创建本地库,以及托管项目到GitHub超详细教程
- python 随机选择数字
- 路由器PPPoE拨号密码(ADSL密码)找出方法 ZT
- html提示更新浏览器的代码,IE9及以下浏览器升级提示
- 开机启动bat以及隐藏运行窗口
- html黑洞效果,HTML5 Canvas炫酷宇宙黑洞引力特效
- python怎么读xlsx_使用Python读取xlsx文件
- Unity编辑器扩展——撤回
- ubuntu如何安装libz库
- Python串口异步通信
- html获取当前ip地址_IP地址精准查询